5

我想要一个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吗?

4

3 回答 3

10

虽然您可以参考委托中的列表,但这通常不是一个好主意。您真的想使用Select提供索引和值的重载:

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

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

于 2012-12-12T07:41:22.677 回答
4

您可以尝试ToDictionary扩展方法:

int index = 0; 
orderMap = myList.ToDictionary(x => x, x => index++);
于 2012-12-12T07:41:46.043 回答
0

看看这个超载的ToDictionary<TKey, TValue>(). 它需要函数将输入元素转换为键和值。

例如

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

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

于 2012-12-12T07:42:44.567 回答