2012-07-06 159 views
0

我有這樣的DataTable,我試圖查詢。LINQ to DataTable查詢

ID|Language 
sfd2133 English 
asd213d English 
vgjj31j English 
fvjfjf2 German 
dac31e3 English 
asaq213 French 
dent231 French 
1dedae3 German 

我設法讓單一語言:

 IEnumerable<Tuple<string, string>> ids= 
      from asset in selectedItems.AsEnumerable() 
      select new Tuple<string, string>(asset["ID"].ToString(), 
      asset["Language"].ToString()); 

如何獲得IEnumerable<List<Tuple<string, string>>其中List<Tuple<string,string>>是ID的集合和單一市場,只能說法語。

+0

你想將它們與語言分組嗎? – 2012-07-06 09:50:07

+0

爲什麼不使用'Dictionary >'而不是? – 2012-07-06 09:57:33

回答

2

我不確定你真正想達到什麼。最簡單的方法獲得的List代替IEnumerable使用ToList()擴展方法:

List<Tuple<string, string>> ids= 
      (from asset in selectedItems.AsEnumerable() 
      select new Tuple<string, string>(asset["ID"].ToString(), 
      asset["Language"].ToString())).ToList(); 

如果你想獲得IEnumerable<List<>>其中每個列表包含單一語言只有行,您可以使用分組語法:

IEnumerable<List<Tuple<string, string>>> ids= 
      from asset in selectedItems.AsEnumerable() 
      group asset by asset["Language"].ToString() into g 
      select g.Select(i => new Tuple<string, string>(i["ID"].ToString(), 
      i["Language"].ToString())).ToList(); 
+0

謝謝,驚人的答案! Dzien kuje: - ))) – 2012-07-06 10:14:07

1
Hello try with (Essaye avec ce code Wild) 

(from asset in selectedItems.AsEnumerable() 

select new 
{ 
    ID= asset.Field<String>("ID"), 
    Language= asset.Field<String>("Language") 
}) 
.AsEnumerable() 
.ToDictionary(k => k.ID, v => v.Language); 
+0

這不起作用,因爲字典不能包含重複的鍵,並且您不按語言進行分組。 – 2012-07-06 10:22:04

2

所以你想按語言分組。

爲什麼不用Dictionary<string, IEnumerable<String>>代替?

Dictionary<String, IEnumerable<String>> DialogResult = 
      selectedItems.AsEnumerable() 
      .GroupBy(r => r.Field<string>("Language")) 
      .ToDictionary(g => g.Key, g => g.Select(r => r.Field<string>("ID"))); 

關鍵是語言,值是IEnumerable<String>的適當的ID。

比如你想列出英語所有的ID,你會做:

var englishIDs = DialogResult["English"]; 
String output = string.Join(", ", englishIDs); // sfd2133, asd213d, vgjj31j, dac31e3 

Dictionaries有最好的查找性能。