按值分组Dictionary<string, int>并拆分至四个独立字典
优雅拆分字典的LINQ方案
嘿,这个需求用LINQ就能轻松搞定,比写for循环优雅太多啦!既然你已经完成了字典的排序,直接基于这个排序后的序列做筛选转字典就可以,完全不用手动遍历判断。
直接拆分实现
基于你已经写好的排序代码,我们可以用Where筛选符合范围的键值对,再用ToDictionary直接生成目标字典:
// 你已完成的排序逻辑 var sortedItems = from pair in dictionary orderby pair.Value ascending select pair; // 拆分四个组 var group1 = sortedItems.Where(p => p.Value >= 1 && p.Value <= 32) .ToDictionary(p => p.Key, p => p.Value); var group2 = sortedItems.Where(p => p.Value >= 33 && p.Value <= 64) .ToDictionary(p => p.Key, p => p.Value); var group3 = sortedItems.Where(p => p.Value >= 101 && p.Value <= 132) .ToDictionary(p => p.Key, p => p.Value); var group4 = sortedItems.Where(p => p.Value >= 133 && p.Value <= 164) .ToDictionary(p => p.Key, p => p.Value);
这种方式是声明式编程,你只需要告诉程序“我要什么”,而不是“怎么实现”,代码可读性拉满,而且因为基于已排序的序列,生成的每个字典都会保持原有的升序顺序。
更灵活的批量处理方案
如果以后需要调整分组范围,或者新增分组,重复写Where会有点冗余。我们可以把分组规则抽出来,批量生成字典:
// 定义所有分组的规则:键是组标识,值是判断条件(这里用了C#9+的模式匹配语法,更简洁) var groupingRules = new Dictionary<string, Func<KeyValuePair<string, int>, bool>> { { "Group1", p => p.Value is >= 1 and <= 32 }, { "Group2", p => p.Value is >= 33 and <= 64 }, { "Group3", p => p.Value is >= 101 and <= 132 }, { "Group4", p => p.Value is >= 133 and <= 164 } }; // 批量生成所有分组字典 var groupedDictionaries = groupingRules.ToDictionary( rule => rule.Key, rule => sortedItems.Where(rule.Value).ToDictionary(p => p.Key, p => p.Value) );
这样以后要修改范围或者加新组,只需要在groupingRules里调整就行,不用重复写筛选逻辑,维护起来更方便。
为什么这比for循环好?
- 代码更简洁,没有冗余的循环变量和条件判断
- 可读性更强,一眼就能看出来每个组的筛选规则
- 基于LINQ的延迟执行特性,筛选过程的性能和手动循环差不多,但代码维护成本低得多
内容的提问来源于stack exchange,提问作者Denzel Obispo
相关产品推荐
相关产品推荐

