2012-05-15 90 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() 
};