如何对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); } } }
代码逻辑解释
Select((item, index) => ...):借助LINQ的带索引重载,给每个元素绑定它在原始List中的插入位置(index就是插入顺序的序号,第一个元素为0,最后一个为6)。OrderBy(x => x.Item.Key):先按Key升序排列,保证不同Key的元素遵循1、2、3、4的顺序。ThenByDescending(x => x.InsertIndex):对于Key相同的元素,按插入索引降序排列——后插入的元素(索引值更大)会排在前面,正好实现插入逆序的需求。Select(x => x.Item):把包装的对象还原成原始的KeyValuePair元素,得到最终的排序结果。
最终输出结果
运行这段代码后,输出会符合预期:
[1, A] [2, C] [2, B] [3, D] [3, E] [3, F] [4, G]
内容的提问来源于stack exchange,提问作者Randeep Singh
相关产品推荐
相关产品推荐

