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

时间:2012-12-12 07:38:31

标签: c# linq sorting

我想采用List,并生成Dictionary,将每个元素映射到List中的索引。对于List<string>

,我可以这样做
var myList = new List<string>{ /* populate list */ };
var orderMap = new Dictionary<string, int>();

foreach (var element in myList)
{
    orderMap[element] = myList.IndexOf(element);
}

基本上,我想采取如下列表:

Apple
Banana
Orange

并返回显示索引的地图:

Apple -> 0
Banana -> 1
Orange -> 2

如何使用Linq执行此操作?我认为这样的事情应该有效:

orderMap = myList.Select( x => /* return a key value pair mapping x to myList.IndexOf(x) */ );

但我无法弄清楚它的正确语法。此外,您是否可以在用于Select

的代理中引用列表本身

3 个答案:

答案 0 :(得分:9)

虽然可以引用代表中的列表,但通常不是一个好主意。你真的想要使用Select的重载来提供索引和值:

var dictionary = list.Select((value, index) => new { value, index })
                     .ToDictionary(p => p.value, p => p.index);

请注意,如果您有任何重复的元素,这将抛出异常。

答案 1 :(得分:3)

您可以尝试ToDictionary扩展方法:

int index = 0; 
orderMap = myList.ToDictionary(x => x, x => index++);

答案 2 :(得分:0)

看看this overload of ToDictionary<TKey, TValue>()。函数将输入元素转换为Key和Value。

e.g。

var myList = new List<string>{ /* populate list */ };
var orderMap = myList.ToDictionary(x => myList.IndexOf(x), x => x);

然而,问题的一个问题是myList的元素不是唯一的。