C# 使用Linq生成列表元素索引的映射

C# 使用Linq生成列表元素索引的映射,c#,linq,sorting,C#,Linq,Sorting,我想获取一个列表,并生成一个字典,它将每个元素映射到列表中的索引。对于列表,我可以这样做: 并返回显示索引的地图: Apple -> 0 Banana -> 1 Orange -> 2 我怎样才能和Linq一起做到这一点?我认为这样做应该奏效: orderMap = myList.Select( x => /* return a key value pair mapping x to myList.IndexOf(x) */ ); 但是我想不出正确的语法。此外,您是否

我想获取一个
列表
,并生成一个
字典
,它将每个元素映射到
列表
中的索引。对于
列表
,我可以这样做:

并返回显示索引的地图:

Apple -> 0
Banana -> 1
Orange -> 2
我怎样才能和Linq一起做到这一点?我认为这样做应该奏效:

orderMap = myList.Select( x => /* return a key value pair mapping x to myList.IndexOf(x) */ );
但是我想不出正确的语法。此外,您是否可以在用于
选择
的代理中引用列表本身?

虽然您可以在代理中引用列表,但这通常不是一个好主意。您确实希望使用
Select
的重载,该重载提供索引和值:

var dictionary = list.Select((value, index) => new { value, index })
                     .ToDictionary(p => p.value, p => p.index);
请注意,如果您有任何重复的元素,这将引发异常。

您可以尝试扩展方法:

int index = 0; 
orderMap = myList.ToDictionary(x => x, x => index++);
看一看。将输入元素转换为键和值需要函数

e、 g

var myList=新列表{/*填充列表*/};
var orderMap=myList.ToDictionary(x=>myList.IndexOf(x),x=>x);

但是,这样做的一个问题是,如果
myList
的元素不是唯一的。

Ick,选择器中的副作用?不,谢谢:)我意识到在这种情况下,它使用的是立即求值,并且会起作用-但这仍然是我个人要避免的事情。这会选择索引作为键,但OP希望字符串是键。@JonSkeet我知道这不是最干净的解决方案。我似乎总是忘记了
Select
:)@L.B.谢谢,修复了这个问题。误读问题。这将在O(n^2*log(n))中运行,而其他两个答案在O(n*log(n))中运行,因为
IndexOf()
将扫描列表。
var dictionary = list.Select((value, index) => new { value, index })
                     .ToDictionary(p => p.value, p => p.index);
int index = 0; 
orderMap = myList.ToDictionary(x => x, x => index++);
var myList = new List<string>{ /* populate list */ };
var orderMap = myList.ToDictionary(x => myList.IndexOf(x), x => x);