【问题标题】:Grouping duplicate values in LINQ在 LINQ 中对重复值进行分组
【发布时间】:2012-02-23 10:39:02
【问题描述】:

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

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

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    听起来你真的只想通过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());
    

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

    【讨论】:

    • 抱歉,您能解释一下为什么在这里查找是好的吗?查找会产生非唯一键,对吗?但是操作需要唯一的键...
    • 抱歉忽略。我现在明白你的推理了:)
    • @Umair:查找仍然有唯一的键,只是它们可以映射到多个元素。引用查找页面:“Lookup 类似于 Dictionary。不同之处在于 Dictionary 将键映射到单个值,而 Lookup 映射键到价值的集合。”在这种情况下,由于查找已经将键映射到值的集合,因此无需使用 TValue 为可枚举对象的 Dictionary。
    • 和 OP 一样,我有一个 int 代替 FOO,我需要 int FOO 的总和而不是 Count;适用于所有酒吧组。你能告诉我我该怎么做吗?通过做类似的事情,我在 var 查找中有一个名为“元素”的集合(它具有单独的 int 值),但我需要它们的总和!
    • @ViV:我建议您发布一个新问题,提供完整的详细信息,包括您尝试过的内容。
    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 2015-05-01
    • 1970-01-01
    • 2023-03-23
    • 2011-02-27
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    相关资源
    最近更新 更多