Друзья, я создаю простой цикл 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;
}
}
}
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
.
Похожие вопросы
Новые вопросы
c#
C # (произносится как «резкий») - это высокоуровневый, статически типизированный язык программирования с несколькими парадигмами, разработанный Microsoft. Код C # обычно нацелен на семейство инструментов и сред выполнения Microsoft .NET, включая, среди прочего, .NET Framework, .NET Core и Xamarin. Используйте этот тег для вопросов о коде, написанном на C # или в формальной спецификации C #.