【问题标题】:Convert a list to a dictionary and sum up values using linq将列表转换为字典并使用 linq 对值求和
【发布时间】:2013-11-05 17:46:36
【问题描述】:

我有列表,即List<Field>。这个 Field 类在其他字段中包含一个代码和一个值属性,我希望能够使用 linq 来总结相同代码的所有值。

我知道我可以遍历我的列表并使用以下代码将其添加到字典中,但我确信必须有一种更简洁的方法来做到这一点:

if (totals.ContainsKey(code))
{
  totals[code] += value;
}
else
{
  totals.Add(code, value);
}

有什么想法吗?

我发现了类似的东西,但这适用于一个列表>这不是我所拥有的:

var result = Sales.SelectMany(d => d) // Flatten the list of dictionaries
             .GroupBy(kvp => kvp.Key, kvp => kvp.Value) // Group the products
             .ToDictionary(g => g.Key, g => g.Sum());

来自这篇文章[在&lt;List&lt;Dictionary&lt;string, int&gt;&gt;中使用Linq求和]Sum amount using Linq in <List<Dictionary<string, int>>

有什么想法吗?我总是可以将我的代码更改为Dictionary&lt;string, Field&gt;,但我确信必须有一种方法可以使用列表和 linq 来做到这一点。

谢谢。

我有列表,即List&lt;Field&gt;。这个 Field 类在其他字段中包含一个代码和一个值属性,我希望能够使用 linq 来总结相同代码的所有值。

我知道我可以遍历我的列表并使用以下代码将其添加到字典中,但我确信必须有一种更简洁的方法来做到这一点:

if (totals.ContainsKey(code))
{
  totals[code] += value;
}
else
{
  totals.Add(code, value);
}

有什么想法吗?

我发现了类似的东西,但这适用于一个列表>这不是我所拥有的:

var result = Sales.SelectMany(d => d) // Flatten the list of dictionaries
             .GroupBy(kvp => kvp.Key, kvp => kvp.Value) // Group the products
             .ToDictionary(g => g.Key, g => g.Sum());

来自这篇文章[在&lt;List&lt;Dictionary&lt;string, int&gt;&gt;中使用Linq求和]Sum amount using Linq in <List<Dictionary<string, int>>

有什么想法吗?我总是可以将我的代码更改为拥有Dictionary&lt;string, Field&gt;,但我确信必须有一种方法可以使用列表和 linq 来做到这一点。

谢谢。

更新:

抱歉,关于上述内容,我想我省略了一个重要部分。该列表包含在另一个列表中,即 List> myitemList;其中将包含其他可能需要进一步过滤的不相关字段。我不确定???

注意:抱歉,格式又搞砸了!

为此提供一些上下文:

Item1(列表类型)

项目名称值

(项目 1)类型 1 (项目2)描述测试 (第 3 项)代码 A (第 4 项) 净额 100.00

Item2(List 类型)

项目名称值

(项目 1)类型 2 (项目 2) 描述 Test1 (第 3 项)代码 B (第 4 项)净值 95.55

Item3(List 类型)

项目名称值

(项目 1)类型 2 (项目 2) 描述 Test2 (第 3 项)代码 A (第 4 项)净值 35.95

如您所见,每个 List 类型的列表包含 4 个字段条目,其中我的字段用名称(字符串)和值(对象)定义

然后将这些列表中的每一个添加到主列表中。所以我需要遍历主列表,然后我想得到一个字典,其中包含每个列表的“代码”和“网络”的总和。所以最后,我应该结束了

A,135.95 乙,95.55

我不知道以上是否有意义。我希望是的!

更新

我正在处理一个列表的事实> 实际上并没有改变,因为我当时实际上想总结一个列表,所以提供的答案是正确的!谢谢!

【问题讨论】:

    标签: c# linq


    【解决方案1】:

    您发布的代码几乎就是您所需要的 - 要在列表中使用它,您需要稍微简化一下:

    var result = myList                             // No flattening
        .GroupBy(x => x.Code)                       // Group the items by the Code
        .ToDictionary(g => g.Key, g => g.Sum(v => v.Value)); // Total up the values
    

    【讨论】:

    • 我认为Sum 是必需的。
    • @Habib 你说得对,Sum 确实是必需的(现在已修复)。
    【解决方案2】:
    var list = new List<Field>
    {
        new Field { Code = "A", Value = 10 },
        new Field { Code = "A", Value = 20 },
        new Field { Code = "B", Value = 30 },
    };
    
    var dic = list
        .GroupBy(z => z.Code)
        .ToDictionary(z => z.Key, z => z.Sum(f => f.Value));
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      Dictionary<string, int> dictionary = 
                  list.GroupBy(r => r.ID)
                      .ToDictionary(grp => grp.Key, grp => grp.Sum(r => r.Value));
      

      考虑到你有这样的课程:

      public class MyClass
      {
          public string ID { get; set; }
          public int Value { get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 2013-07-29
        • 1970-01-01
        • 2011-11-03
        • 1970-01-01
        • 2020-07-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-09
        相关资源
        最近更新 更多