如何将LINQ查询结果存入MultiKeyDictionary及统计分组对象组合数量
实现按组和人员统计并填充MultiKeyDictionary
我来帮你一步步搞定这个需求,核心思路是先用LINQ完成分组统计,再把结果映射到MultiKeyDictionary中。假设你的MultiKeyDictionary支持通过双键添加元素(比如有Add(string key1, string key2, int value)方法或者索引器this[string key1, string key2]),下面是完整的方法实现:
public MultiKeyDictionary<string, string, int> GetPersonsPerGroup(IEnumerable<Home> homes, List<string> gr, List<string> na) { // 初始化目标字典 var resultDict = new MultiKeyDictionary<string, string, int>(); // 用LINQ完成过滤、分组和统计 var groupedData = homes // 先筛选出指定组和指定人员的数据,避免统计无关内容 .Where(h => gr.Contains(h.groupname) && na.Contains(h.personname)) // 按组名+人名的组合作为键分组 .GroupBy(h => new { h.groupname, h.personname }) // 统计每个组合对应的对象数量 .Select(g => new { GroupName = g.Key.groupname, PersonName = g.Key.personname, Count = g.Count() }); // 遍历统计结果,填充到MultiKeyDictionary中 foreach (var item in groupedData) { // 如果字典支持索引赋值就用这个,否则用Add方法(分组已保证键唯一,不会冲突) resultDict[item.GroupName, item.PersonName] = item.Count; // 替代写法:resultDict.Add(item.GroupName, item.PersonName, item.Count); } return resultDict; }
关键步骤拆解:
- 过滤数据:用
Where筛选出属于目标组列表gr和目标人员列表na的Home对象,减少后续分组的计算量。 - 分组统计:通过
GroupBy创建以groupname和personname为组合键的分组,再用Count()统计每个组合对应的对象总数。 - 填充字典:遍历LINQ输出的统计结果,将每组的双键和计数同步到
MultiKeyDictionary中。如果你的字典实现支持批量初始化(比如接受元组序列的构造方法),还可以简化成:// 假设MultiKeyDictionary支持元组序列初始化 var groupedTuples = groupedData.Select(item => (item.GroupName, item.PersonName, item.Count)); var resultDict = new MultiKeyDictionary<string, string, int>(groupedTuples);
内容的提问来源于stack exchange,提问作者Vandenberghe Willy
相关产品推荐
相关产品推荐

