如何用Linq/MoreLinq将唯一元素列表转为索引字典?
用LINQ/MoreLINQ生成元素索引字典的解决方案
原生LINQ实现
原生LINQ提供了带索引参数的Select重载,可直接获取元素及其在序列中的位置,再通过ToDictionary转换为目标字典:
Dictionary<int, int> lookup = things .Select((item, index) => new { item.Id, index }) .ToDictionary(entry => entry.Id, entry => entry.index);
由于题目明确列表中ID唯一,无需处理重复键异常,直接使用ToDictionary即可。
MoreLINQ实现
MoreLINQ的Enumerate方法会返回包含元素值和对应索引的结构,同样可以快速生成字典:
// 需要先引用MoreLINQ库 Dictionary<int, int> lookup = things .Enumerate() .ToDictionary(entry => entry.Value.Id, entry => entry.Index);
算法名称
这个建立元素到其位置映射的操作,通常被称为反向索引(Reverse Indexing)或位置映射(Position Mapping)。
额外说明
- 很多人容易忽略LINQ中
Select的带索引重载,它正是解决“获取元素序列索引”需求的关键。 - 若存在重复ID的场景,可改用
ToLookup先分组再处理,但本题中无需考虑该情况。
内容的提问来源于stack exchange,提问作者Mr. Boy
相关产品推荐
相关产品推荐

