You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对C# List排序,使重复项按插入逆序排列

解决List排序后重复项按插入逆序排列的问题

首先,问题的核心是:我们需要按Key升序排序,但对于Key相同的元素,要按照它们插入List的逆序排列——也就是后插入的同Key元素排在前面。

你之前尝试用OrderByDescending没达到预期,是因为它会把整个Key的顺序都反转(比如Key会从4到1降序),而不是只反转同Key内的元素顺序。要实现需求,我们需要先保留每个元素的原始插入索引,然后在排序时先按Key升序,再按插入索引降序。

具体实现代码

public class Program { 
    public static void Main(string[] args) { 
        List<KeyValuePair<int, string>> list = new List<KeyValuePair<int, string>>(); 
        list.Add(new KeyValuePair<int, string>(1, "A")); 
        list.Add(new KeyValuePair<int, string>(3, "F")); 
        list.Add(new KeyValuePair<int, string>(4, "G")); 
        list.Add(new KeyValuePair<int, string>(2, "B")); 
        list.Add(new KeyValuePair<int, string>(2, "C")); 
        list.Add(new KeyValuePair<int, string>(3, "E")); 
        list.Add(new KeyValuePair<int, string>(3, "D")); 
        
        // 保留原始插入索引,再执行排序逻辑
        var sortedList = list
            .Select((item, index) => new { Item = item, InsertIndex = index })
            .OrderBy(x => x.Item.Key)
            .ThenByDescending(x => x.InsertIndex)
            .Select(x => x.Item)
            .ToList(); 
        
        foreach(var item in sortedList) { 
            Console.WriteLine(item); 
        } 
    } 
}

代码逻辑解释

  1. Select((item, index) => ...):借助LINQ的带索引重载,给每个元素绑定它在原始List中的插入位置(index就是插入顺序的序号,第一个元素为0,最后一个为6)。
  2. OrderBy(x => x.Item.Key):先按Key升序排列,保证不同Key的元素遵循1、2、3、4的顺序。
  3. ThenByDescending(x => x.InsertIndex):对于Key相同的元素,按插入索引降序排列——后插入的元素(索引值更大)会排在前面,正好实现插入逆序的需求。
  4. Select(x => x.Item):把包装的对象还原成原始的KeyValuePair元素,得到最终的排序结果。

最终输出结果

运行这段代码后,输出会符合预期:

[1, A] 
[2, C] 
[2, B] 
[3, D] 
[3, E] 
[3, F] 
[4, G]

内容的提问来源于stack exchange,提问作者Randeep Singh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:03:24