迭代列表并求和并将结果放入字典中

时间:2015-11-18 08:55:24

标签: c# linq

假设我有两个(可能更多)具有相同字段/属性的相同对象的列表。 每个列表代表相同的对象

Proerpties:

HoursWorked
HoursRate

我想采用迭代并从所有列表中获取每个字段的总和(可以是2,3或者左右)并将其存储在具有键值对的字典中。 e.g HoursWorked:2 and HourseRate:6

目前,我只能在一个字段中执行此操作(硬编码)。我想让它变得通用,所以我可以用所有字段的键/值填充字典。

我已将字典定义为

public Dictionary<string, double> TotalCount { get; set; }

Linq查询:

Dictionary<string, double> totalCount = records
.GroupBy(x => records)
.ToDictionary(x => Convert.ToString("HoursWorked"), x => x.Where(y => y.HoursWorked != null).Sum(y => y.HoursWorked).Value);

对此有何帮助?

示例数据

Input
    report = 
    { 
    [HoursWorked: 1.0, HoursRate:10], 
    [HoursWork:2.0, HoursRate:15]
    }

Expected Output
Dictioary = {Key:HoursWorked Value: 3.0,Key:HoursRate Value:25}

2 个答案:

答案 0 :(得分:0)

Dictionary<string, double> dictionary = new[] { "HoursWorked", "HoursRate" }
    .ToDictionary(k => k, v => collections
        .SelectMany(x => x)
        .Sum(y => (double)y.GetType().GetProperty(v).GetValue(y)));

其中&#39;集合&#39;是你的列表集合。 显然完全不安全,很容易摔倒!

我认为,与使用反射相比,更好的模式是编写一个方法或接口,在给定字符串键的情况下返回正确的double值。

答案 1 :(得分:-1)

class someObject
    {
        public int workingHours { get; set; }
        public int hourRate { get; set; }
    }

您可以从所有列表中创建公共列表。

List<SomeObject> lst = new List<SomeObject>();
lst.AddRange(Oldlst1);
lst.AddRange(Oldlst2);

然后您可以根据小时费率进行分组。

var n = lst.GroupBy(x=>x.hourRate);

然后你可以创建一个字典。

var m=n.ToDictionary(x=>x.Key, x=>x.Sum(y=>y.workingHours));

在这里,你将获得hourRate,并且你将获得工作时间的总和。