如何按指定顺序对C#中包含三类值的字典进行排序?
搞定字典排序:按红→黄→白优先级+自定义规则排序
嘿,我明白你的需求了——你有一组随机生成的1-100数字,按红、黄、白循环分配了颜色,现在想把这个数字-颜色的映射按指定顺序(先红,再黄,最后白)排好,对吧?下面给你两种常用的排序方案,按需选就行:
先明确排序优先级
首先得给颜色定个「排序权重」,这样程序才知道谁先谁后。我们手动给红、黄、白分配优先级数值,红的权重最高(0),黄其次(1),白最低(2):
var colorPriority = new Dictionary<ColorType, int> { { ColorType.Red, 0 }, { ColorType.Yellow, 1 }, { ColorType.White, 2 } };
方案1:按颜色优先级+数字大小排序
如果希望同颜色的数字按从小到大(或从大到小)排列,用LINQ的OrderBy+ThenBy就能轻松实现:
如果你用的是Dictionary<int, ColorType>
注意字典本身是无序的,得先转成键值对列表再排序:
// 假设你的原始字典叫numberColorMap var sortedList = numberColorMap .OrderBy(kv => colorPriority[kv.Value]) // 先按颜色优先级排 .ThenBy(kv => kv.Key) // 同颜色内按数字升序,降序就用ThenByDescending .ToList();
如果你用的是List<KeyValuePair<int, ColorType>>
直接对列表排序就行:
var sortedList = numberColorList .OrderBy(kv => colorPriority[kv.Value]) .ThenBy(kv => kv.Key) .ToList();
方案2:按颜色优先级+原始随机顺序排序
如果想保留同颜色数字当初分配时的随机顺序(也就是你生成lstNumbers时的顺序),那得在分配颜色的时候顺便记录每个数字的原始位置:
分配颜色时记录索引
var lstNumbers = Enumerable.Range(1, 100).OrderBy(n => Guid.NewGuid().GetHashCode()).ToList(); var colorCycle = new List<ColorType> { ColorType.Red, ColorType.Yellow, ColorType.White }; // 把数字、颜色、原始索引打包在一起 var numberColorWithIndex = lstNumbers.Select((num, index) => new { Number = num, Color = colorCycle[index % colorCycle.Count], OriginalIndex = index }).ToList();
按颜色+原始索引排序
var sortedList = numberColorWithIndex .OrderBy(item => colorPriority[item.Color]) .ThenBy(item => item.OriginalIndex) // 按当初的随机顺序排 .Select(item => new KeyValuePair<int, ColorType>(item.Number, item.Color)) .ToList();
(可选)转成有序字典
如果需要把排序后的结果存成有序的字典结构,可以用OrderedDictionary(记得引用System.Collections.Specialized):
using System.Collections.Specialized; var orderedDict = new OrderedDictionary(); foreach (var kv in sortedList) { orderedDict.Add(kv.Key, kv.Value); }
这样处理后,你的数字-颜色映射就完全按你想要的顺序排列啦!
内容的提问来源于stack exchange,提问作者Justeasy StackAttacka
相关产品推荐
相关产品推荐

