将列表转换为字典并使用linq汇总值

时间:2013-11-05 17:46:37

标签: c# linq

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

我知道我可以遍历我的列表并使用以下代码将其添加到字典中,但我确信必须有一种更清晰的方法来执行此操作:

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

有什么想法吗?

我发现了类似的内容,但这适用于列表&gt;这不是我所拥有的:

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

来自本文[使用Linq在[{1}}] Sum amount using Linq in <List<Dictionary<string, int>>

中的总金额

有什么想法吗?我总是可以将我的代码更改为<List<Dictionary<string, int>>,但我确信必须有一种方法可以使用list和linq。

感谢。

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

我知道我可以遍历我的列表并使用以下代码将其添加到字典中,但我确信必须有一种更清晰的方法来执行此操作:

List<Field>

有什么想法吗?

我发现了类似的内容,但这适用于列表&gt;这不是我所拥有的:

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

来自本文[使用Linq在[{1}}] Sum amount using Linq in <List<Dictionary<string, int>>

中的总金额

有什么想法吗?我总是可以将我的代码更改为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()); ,但我确信必须有一种方法可以使用list和linq。

感谢。

更新

对不起,我想我省略了有关上述内容的重要部分。该列表包含在另一个列表中,即List&gt; myitemList;其中包含其他可能需要进一步过滤的无关字段。我不确定???

注意:抱歉格式化再次搞砸了!

为此提供一些背景信息:

Item1(List类型)

项目名称值

(第1项)类型1 (第2项)描述测试 (第3项)守则A. (第4项)净100.00

Item2(List类型)

项目名称值

(第1项)第2类 (第2项)说明测试1 (第3项)代码B. (第4项)净95.55

Item3(List类型)

项目名称值

(第1项)第2类 (第2项)说明测试2 (第3项)守则A. (第4项)净35.95

正如您所看到的List类型列表包含4个字段条目,其中我的字段使用Name(String)和Value(Object)定义

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

A,135.95 B,95.55

我不知道上述是否有意义。我希望它能做到!

更新

我正在处理列表&gt;实际上并没有因为我当时想要总结一个列表而有所不同,所以提供答案是正确的!谢谢!

3 个答案:

答案 0 :(得分:9)

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

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

答案 1 :(得分:4)

你可以这样做:

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; }
}

答案 2 :(得分:3)

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