对LINQ中的重复值进行分组

本文关键字:LINQ | 更新日期: 2023-09-27 18:25:28

我有一个格式的简单对象

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

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

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

我希望将这些项分组,使它们如下:一个具有唯一"bar"键的Dictionary<string,List<string>,以及一个具有关联"foo"值的List<string>

  • 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的正确方法是什么?

对LINQ中的重复值进行分组

听起来你真的只是想通过ToLookup方法得到一个Lookup

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());

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