如何高效实现字典指定规则项移除与按数字、颜色排序?
高效实现方案详解
当然有高效的实现方式!咱们结合C#的特性,用最少的遍历次数+最优的排序逻辑来搞定这个需求,同时保证代码可读性。
先明确核心过滤规则
咱们先把需求翻译成清晰的保留条件(反向思考比移除更直观):
- 保留:不是Red色 或者 是Red色但为奇数(排除Red的偶数)
- 保留:不是Yellow色 或者 是Yellow色但为偶数(排除Yellow的奇数)
- 保留:不是White色 或者 是White色但不能被3整除(排除White且能被3整除的数)
高效实现代码
利用LINQ的链式调用,把「配对颜色→过滤→排序」合并成一次逻辑处理,避免多次遍历数组:
// 先定义枚举(假设你已经定义过,这里再明确一下) public enum ColorType { Red, Yellow, White } // 假设你已经初始化好这两个变量 var map = new Dictionary<int, ColorType>(); var lstNumbers = Enumerable.Range(1, 100).OrderBy(n => Guid.NewGuid().GetHashCode()).ToArray(); // 核心处理逻辑 var result = lstNumbers // 1. 把数字和对应的颜色配对(确保每个数字都在字典中,否则用TryGetValue处理) .Select(num => new { Number = num, Color = map[num] }) // 2. 一次性过滤所有不符合条件的项 .Where(item => (item.Color != ColorType.Red || item.Number % 2 != 0) && (item.Color != ColorType.Yellow || item.Number % 2 == 0) && (item.Color != ColorType.White || item.Number % 3 != 0) ) // 3. 先按数字升序,再按颜色排序(枚举默认按定义顺序:Red < Yellow < White) .OrderBy(item => item.Number) .ThenBy(item => item.Color) // 按需转换成列表或数组,也可以保持IEnumerable延迟执行 .ToList(); // 如果只需要最终的数字数组,再加一步Select var resultNumbers = result.Select(item => item.Number).ToArray();
为什么这个方案高效?
- 最少遍历次数:Select+Where是一次遍历(LINQ延迟执行,不会提前加载所有数据),排序是一次O(n log n)的操作——这是理论最优复杂度,因为排序本身无法低于O(n log n),过滤的O(n)可以忽略不计。
- 内存效率高:链式调用不会产生中间数组,所有操作都是流式处理,避免不必要的内存占用。
- 代码可读性强:逻辑清晰,每一步都对应需求,后续维护起来很方便。
额外注意事项
- 如果
lstNumbers中存在不在map中的数字,一定要用TryGetValue避免KeyNotFoundException:.Select(num => { if (map.TryGetValue(num, out var color)) return new { Number = num, Color = color }; // 这里可以选择跳过该数字,或者赋予默认颜色,比如: // return new { Number = num, Color = ColorType.White }; return null; }) .Where(item => item != null && /* 过滤条件 */) - 自定义颜色排序顺序:如果默认的枚举顺序(Red→Yellow→White)不符合需求,可以在
ThenBy中用自定义比较器:.ThenBy(item => item.Color, Comparer<ColorType>.Create((a, b) => { // 比如让White排最前,然后Red,最后Yellow var colorOrder = new Dictionary<ColorType, int> { { ColorType.White, 0 }, { ColorType.Red, 1 }, { ColorType.Yellow, 2 } }; return colorOrder[a].CompareTo(colorOrder[b]); }))
内容的提问来源于stack exchange,提问作者Justeasy StackAttacka
相关产品推荐
相关产品推荐

