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);