2012-05-15 89 views
1

我struggeling一點與嘗試寫LINQ查詢做到以下幾點,LINQ字典非重複值

public class MyClass 
{ 
    public int ID {get; set;} 
    public int Name {get; set;} 
    public IEnumerable<string> SomeIEnumerable {get; set;} 
} 

我試圖創建一個使用LINQ從數據庫查詢將返回什麼對象如下,

ID Name  SomeString 
0  NameA "MyValue" 
1  NameB "Value1" 
1  NameB "Value2" 
2  NameC "Value" 

的LINQ是很容易寫爲好,

from DataRow row in dataSet.Tables[0].Rows 
select new MyClass 
{ 
    ID = (int)row["ID"], 
    Name = row["Name"].ToString(), 
    SomeIEnumerable = new List<string>{ row["SomeString"].ToString() } 
}; 

棘手一部分是我怎麼變成一個字典,其中 辭典[1] .SomeIEnumerable = {「值1」,「值2」}

一個簡單的ToDictionary將在這裏拋出ArgumentException

的主要問題,是如何我是否處理了關鍵字不明確的事實,並且能夠在臨時字典中查找現有值,以便將它添加到我感興趣的值中。

+0

鍵需要不同,因爲您可以通過id僅選擇不同的行。 –

+0

你的「非常容易」的LINQ將無法工作,因爲Add()返回void。但是像'新列表 {(字符串)行[「SomeString」]}'會。 – svick

+0

@svick謝謝,調整我的問題 –

回答

2

您還可以將分組,然後用IGrouping檢索項目的列表中選擇組在

示例代碼

var simulatedData = Enumerable.Range(0,10).Select(x=> new {Key=x%3+1, Index=x}); 
    var dict = simulatedData.GroupBy(x=>x.Key).ToDictionary(x=>x.Key, x=>x.Select(t=>t.Index)); 
+0

謝謝,我會在一秒鐘內回覆我 –

1

回答感謝@Tilak是,

from DataRow row in dataSet.Tables[0].Rows 
group row by new 
{ 
    ID = (int) row["ID"], 
    Name = row["Name].ToString() 
} into rowGroup 
select new MyClass 
{ 
    ID = rowGroup.Key.ID, 
    Name = rowGroup.Key.Name, 
    SomeIEnumerable = 
     from row in rowGroup 
     select row["SomeString"].ToString() 
};