2016-03-14 1 views
0

Я пытаюсь обновить Datatable со значением словаря на основе ключа, соответствующего совпадению со словарем. Ниже приведен фрагмент кода. Он не обновляется.Обновление datatable с использованием условия на основе linq с использованием словаря

class Program 
{ 
    static void Main(string[] args) 
    { 
     DataTable dt = new DataTable(); 
     dt.Columns.Add("col1"); 
     dt.Columns.Add("value"); 

     DataRow dr = dt.NewRow(); 
     dr["col1"] = "key1"; 
     dr["value"] = "No"; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["col1"] = "key2"; 
     dr["value"] = "Yes"; 
     dt.Rows.Add(dr); 

     dr = dt.NewRow(); 
     dr["col1"] = "key3"; 
     dr["value"] = "No"; 
     dt.Rows.Add(dr); 


     Dictionary<string, string> test = new Dictionary<string, string>(); 
     test.Add("key1", "Yes"); 
     test.Add("key2", "No"); 
     test.Add("key3", "No"); 


     dt.AsEnumerable().Where(r => r["col1"] == test.Select(x => x.Key)).ToList<DataRow>().ForEach(y => y["value"] = "Yes"); 
     dt.AcceptChanges(); 

} 
} 

ответ

0

Даже если она будет работать таким образом, вы обновляете его "Yes" вместо значения из словаря. Вы также используете Enumerable.Select вместо Dictionary.ContainsKey, что является реальной проблемой.

Так я думаю, что это будет исправить как:

dt.AsEnumerable() 
    .Where(row => test.ContainsKey(row.Field<string>("col1"))) 
    .ToList<DataRow>() 
    .ForEach(row => row["value"] = test[row.Field<string>("col1")]); 

Вместо того, чтобы создать этот список, чтобы использовать ForEach я бы предпочел другой подход:

var newValues = from row in dt.AsEnumerable() 
       join kv in test on row.Field<string>("col1") equals kv.Value 
       select new{ DataRow = row, NewValue = kv.Value }; 
foreach (var x in newValues) 
    x.DataRow["col1"] = x.NewValue; 
+0

Спасибо. это сработало. – Hemil

+0

@Hemil: тогда подумайте, чтобы принять его. Пожалуйста :) –

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