在LINQ中对重复值进行分组

时间:2012-02-23 10:39:02

标签: c# linq

我有一个简单的对象,格式为

class MyObject {
    public string foo;
    public string bar;
}

我有一个这些对象的列表,其中'foo'的值是唯一的,而'bar'的值不是。例如 - 想象一下值如下

  • Foo1,Bar1
  • Foo2,Bar2
  • Foo3,Bar1
  • Foo4,Bar3

我希望对这些项目进行分组,使其如下所示:Dictionary<string,List<string>具有唯一的“条形码”键,以及List<string>相关的“foo”值。

  • Bar1,[Foo1,Foo3]
  • Bar2,[Foo2]
  • Bar3,[Foo4]

我可以使用一个相当简单的循环来做到这一点 -

Dictionary<string,List<string>> result = new Dictionary<string,List<string>>();
myObjectList = new List<MyObject>();
foreach (MyObject obj in myObjectList)
{
    if (result.ContainsKey(obj.bar))
    {
        result[obj.bar].Add(obj.foo);
    } 
    else 
    {
        result.Add(obj.bar,new List<string> {obj.foo});
    }
}

但我正在努力学习如何正确使用LINQ,似乎有一个优雅的解决方案使用它。使用LINQ执行此操作的正确方法是什么?

1 个答案:

答案 0 :(得分:7)

听起来你真的只想通过Lookup方法获得ToLookup

var lookup = myObjectList.ToLookup(x => x.bar, x => x.foo);

如果真的需要Dictionary,您可以使用以下内容:

var dictionary = myObjectList.GroupBy(x => x.bar, x => x.foo)
                             .ToDictionary(g => g.Key, g => g.ToList());

...但如果可以,我会使用查找。