Друзья, я создаю простой цикл foreach, который получает информацию из DataTable (tblCORR) и создает с ним 3 других DT (tblCEMVALVE, tblLOG, tblNUMBER). Предостережение заключается в том, что он должен использовать разные типы столбцов в соответствии с тем, что указано в tblCORR, но, конечно, typeof не допускает row.ItemArray [2] в качестве типа.

TblCORR выглядит так:

LAS.V342.B.REM.ST   V342_REM    bool    tblLOG      tblVALVE
CEM.CV44.B.REM.ST   CV44_REM    bool    tblCEMVALVE tblVALVE
CEM.FRT01.PTO06.ST  FR_PTO06    bool    tblLOG      tblSTATUS
CEM.GB02.GEAR.CTR   RR_GEAR_SEL byte    tblLOG      tblSTATUS
CEM.PT21.I_PRES.PSI PT21_PRESS  Short   tblNUMBER   tblDATA
RCP.ADD1.NAME.TXT   LAS_ADD1    string  tblNUMBER   tblLAS

Есть ли способ сделать это, не добавляя в каждом случае кучу IF?

Заранее спасибо!

foreach (DataRow row in tblCORR.Rows)
{
    switch (row.ItemArray[3].ToString())
    {
        case "tblCEMVALVE":
        {
            tblCEMVALVE.Columns.Add(row.ItemArray[1].ToString(), typeof(row.ItemArray[2]));
            break;
        }
        case "tblLOG":
        {
            tblLOG.Columns.Add(row.ItemArray[1].ToString(), typeof(row.ItemArray[2]));
            break;
        }
        case "tblNUMBER":
        {
            tblNUMBER.Columns.Add(row.ItemArray[1].ToString(), typeof(row.ItemArray[2]));
            break;
        }
    }
}
0
LucasRossi 19 Янв 2014 в 23:43

1 ответ

Лучший ответ

С этими именами типов (они не являются именами классов / структур в пространстве имен System) одним из возможных решений является использование Dictionary. Например (подробный код для иллюстрации):

Dictionary<object, Type> knownTypes = new Dictionary<object, Type>();
knownTypes.Add("bool", typeof(bool));
knownTypes.Add("byte", typeof(byte));
knownTypes.Add("Short", typeof(short));
knownTypes.Add("string", typeof(string));

Для использования в качестве:

tblLOG.Columns.Add(row.ItemArray[1].ToString(), knownTypes[row.ItemArray[2]]);

Некоторые изменения, которые вы можете / должны учитывать:

  • Сделайте словарь членом класса static и private.
  • Используйте набранный ключ для словаря (используя row.ItemArray[2].ToString()).
  • Используйте нечувствительный к регистру компаратор StringComparer.InvariantCultureIgnoreCase для словарного ключа (если string), чтобы short и Short были эквивалентны.
  • Используйте аналогичную технику и для таблиц (tblLOG, tblNUMBER и tblCEMVALVE) или ищите их напрямую, используя их TableName внутри DataSet.
0
Adriano Repetti 19 Янв 2014 в 23:58