2015-03-23 4 views
1

У меня есть следующее Datatable в VbДобавляет столбец в существующей DataTable с динамически связанными значениями

Id   Price 
    -----   ------- 
    1231   100 
    1232   150 
    1235   150 

Я хочу добавить третий столбец в этой DataTable называется flag со значениями последней цифры Id

Как следующее:

Id    Price   Flag 
    -----   ------  ---------- 
    1231    100    1 
    1232    150    2 
    1235    150    5 

Как добавить столбец в существующий DataTable, с динамически связанными значениями?

Есть ли способ, которым я могу это сделать, не используя For Loop?

Любая помощь будет оценена

ответ

3

Сначала нужно добавить DataColumn:

table.Columns.Add("Flag", typeof(int)); 

Теперь вам просто нужно добавить значения соответственно:

foreach(DataRow row in table.Rows) 
{ 
    int ID = row.Field<int>("ID"); 
    string lastDigit = ID.ToString().Last().ToString(); 
    row.SetField("Flag", int.Parse(lastDigit)); 
} 

Единственный способ избежать цикл должен заполнить его этими значениями, в первую очередь, например, если он заполнен из базы данных. Таким образом, даже если существует подход DataColumn.Expression (что здесь не так), это вызовет цикл в рамках.

+0

Есть ли способ сделать это без петли? – HelpASisterOut

+1

@HelpASisterOut: нет, нет. И даже если «был» способ (например, с помощью ['DataColumn.Expression'] (https://msdn.microsoft.com/en-us/library/system.data.datacolumn.expression%28v=vs.110% 29.aspx)), структура будет использовать цикл неявно. –

0

Есть ли способ, которым я могу это сделать, не используя For Loop?

Да, добавить вычисляемый столбец со следующим expression:

[id] % 10 

Пример (vb.net):

Using table As New DataTable() 

    table.Columns.Add("Id", GetType(Integer)) 
    table.Columns.Add("Price", GetType(Decimal)) 

    table.Rows.Add(1231I, 100D) 
    table.Rows.Add(1232I, 150D) 
    table.Rows.Add(1235I, 150D) 

    'Add a new computed column:     expr 
    table.Columns.Add("Flag", GetType(Integer), "[id] % 10") 

    For Each row As DataRow In table.Rows 
     Debug.WriteLine("{0} {1} {2}", row.ItemArray) 
    Next 

End Using 

Пример (С #):

using (DataTable table = new DataTable()) 
{ 

    table.Columns.Add("Id", typeof(int)); 
    table.Columns.Add("Price", typeof(decimal)); 

    table.Rows.Add(1231, 100M); 
    table.Rows.Add(1232, 150M); 
    table.Rows.Add(1235, 150M); 

    //Add a new computed column:    expr 
    table.Columns.Add("Flag", typeof(int), "[id] % 10"); 

    foreach (DataRow row in table.Rows) 
    { 
     Debug.WriteLine("{0} {1} {2}", row.ItemArray); 
    } 

} 

Выход:

 
1231 100 1 
1232 150 2 
1235 150 5 
+0

Отладка части, где я добавляю вычисленный столбец, занимает слишком много времени без ответа. Почему вы думаете? – HelpASisterOut

+0

Сколько строк? Я тестировал таблицу, содержащую 1 миллион строк, потребовалось ~ 2 секунды. –

Смежные вопросы