c# - 在 LINQ 中对重复值进行分组

标签 c# linq

我有一个格式为

的简单对象
class MyObject {
    public string foo;
    public string bar;
}

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

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

我希望对项目进行分组,如下所示,Dictionary<string,List<string>带有独特的“bar”键,和一个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 执行此操作的正确方法是什么?

最佳答案

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

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

如果你真的需要一个字典,你可以使用像这样的东西:

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

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

关于c# - 在 LINQ 中对重复值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9411362/

相关文章:

c# - 有人能告诉我为什么这个简单的 c# 代码不起作用,涉及从自身内部递归调用方法以获取根类别 ID

LINQ - 加入 OR 条件

c# - 使用 Linq to Entities 查询创建 null ienumerable

c# - LINQ 延迟(或立即?)执行

javascript - 尝试使用 JavaScript 在 CefSharp3 (OffScreen) 中模拟用户输入

c# - 将 Excel 2013 与 C# 不正确的行号一起使用

c# - 如何使用 EPPlus 一次插入一行

c# - 如何在C#中修改Http Method?

c# - 在 Metro 应用程序中将数组从 javascript 传递到 C#

c# - LINQ 选择 Lambda 形式的非重复计数