将数组转换为字典,将value作为项的索引,将key作为项本身

时间:2013-03-06 16:04:22

标签: c# linq dictionary

我有一个数组,如 -

arr[0] = "Name";
arr[1] = "Address";
arr[2] = "Phone";
...

我想创建一个Dictionary<string, int>,使数组值成为字典键,字典值将成为索引,这样我就可以通过在{{1中查询它的名字来获取列的索引}}。我知道这应该相当简单,但我无法理解它。

我试过了 -

O(1)

但是,这会返回 -

Dictionary<string, int> myDict = arr.ToDictionary(x => x, x => indexOf(x))

我知道这是因为它存储了第一次出现的索引,但那不是我想要做的。

2 个答案:

答案 0 :(得分:62)

您可以使用包含索引的Select重载:

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

或使用Enumerable.Range

var dictionary = Enumerable.Range(0, array.Length).ToDictionary(x => array[x]);

请注意,如果您尝试提供两个相等的密钥,ToDictionary将引发异常。你应该仔细考虑你的数组中有两个相等值的可能性,以及你想在那种情况下发生什么。

我只是想手动做这件事:

var dictionary = new Dictionary<string, int>();
for (int i = 0; i < array.Length; i++)
{
    dictionary[array[i]] = i;
}

答案 1 :(得分:1)

另一种方式是:

var dictionary = arr.ToDictionary(x => Array.IndexOf(arr, x));