计算通用列表中存在的字典中值的总和

时间:2017-02-14 14:54:56

标签: c# .net linq list dictionary

我对LINQ并不是特别熟练,所以我可以在这个特定场景中使用一些帮助。

我有一个字典项列表。我需要在字典中对值进行求和,其中键存在于字符串列表中。

我如何为这样的东西编写LINQ表达式?

Dictionary<string, decimal> cars = new Dictionary<string, decimal>();

cars.Add("Ford", 1.2M);
cars.Add("Chevy", 2M);
cars.Add("Toyota", 3M);
cars.Add("Audi", 5M);

List<string> selectedList = new List<string>();
selectedList.Add("Chevy");
selectedList.Add("Audi");

4 个答案:

答案 0 :(得分:11)

就这样:

var sum = selectedList.Sum(s=>cars[s]);

或者,如果您不确定,所有值都在字典中(感谢Tim Schmelter进行更正):

var sum = selectedList.Sum(s=>cars.ContainsKey(s)?cars[s]:0);

编辑:更好的是Tim提出的解决方案:

selectedList.Where(cars.ContainsKey).Sum(s => cars[s])

答案 1 :(得分:5)

您可以过滤字典中的项目,然后对值进行求和:

var sum = cars
    .Where(item => selectedList.Contains(item.Key))
    .Sum(item => item.Value);

答案 2 :(得分:1)

所以,这是一种不同的方法,可能会对某些边缘情况执行得更好:

var sum = selectedList
            .Distinct()
            .Sum(s =>
            {
                decimal d;
                if (cars.TryGetValue(s, out d))
                {
                    return d;
                }
                return 0;
            }
        );

您只需要迭代列表中的不同值,这样您就可以避免在cars字典中重复查找(如果不是这样,那么只需注释掉{{ 1}})。无论列表或字典是否更大,这都应该提供良好的性能平衡。

答案 3 :(得分:0)

替代非LINQ答案:

decimal total = 0;
foreach (var car in selectedList)
{
    total += cars[car];
}