我对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");
答案 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];
}