C#中如何按元素最后出现顺序选取列表值 可否用GroupBy实现

该需求完全可以通过GroupBy方法实现,以下是具体实现方案:
实现核心逻辑
GroupBy默认会按照序列中元素首次出现的顺序生成分组,我们只需要配合简单的顺序调整、分组取值逻辑,就能得到按元素最后一次出现顺序排列的结果,不需要依赖复杂的自定义遍历,常用实现思路有两种:
- 显式记录每个元素最后一次出现的索引,分组取每组最后一个元素后,按记录的最后出现索引升序排序
- 先将原序列倒序,此时倒序序列中元素第一次出现的位置就是原序列中该元素最后一次出现的位置,直接用GroupBy取每组第一个元素,最后再将结果倒序还原即可,不需要额外构建索引映射
代码实现(以C# LINQ为例,其他支持GroupBy的语言逻辑通用)
写法1:显式记录最后出现索引(逻辑直观易读)
// 原始测试列表,对应示例场景 var sourceList = new List<int> { 3, 2, 1, 3, 2 }; // 第一步:遍历列表记录每个元素最后一次出现的索引 var lastOccurIndex = sourceList .Select((item, index) => (item, index)) .ToDictionary(x => x.item, x => x.index); // 第二步:分组后取每个分组最后出现的元素,按最后出现索引排序 var result = sourceList .GroupBy(item => item) .Select(group => group.Last()) .OrderBy(item => lastOccurIndex[item]) .ToList(); // 最终输出结果为 [1,3,2],完全匹配按最后一次出现顺序排列的要求
写法2:倒序简化写法(无需额外构建索引映射)
var sourceList = new List<int> { 3, 2, 1, 3, 2 }; var result = sourceList .Reverse() .GroupBy(item => item) .Select(group => group.First()) .Reverse() .ToList();
注:如果处理引用类型元素,只需要将GroupBy的键判断逻辑替换为你需要的相等性判断规则即可,整体逻辑不需要调整。Python、Java等其他语言环境下也可以直接复用这套思路,仅需对应调整语法。
内容的提问来源于stack exchange,提问作者Roli
相关产品推荐
相关产品推荐

