41

我有一个数组,例如-

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

我想创建一个Dictionary<string, int>这样的数组值将是字典键,字典值将是索引,这样我就可以通过在O(1). 我知道这应该相当简单,但我无法理解它。

我试过了 -

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

但是,这会返回-

{(Name, 0), (Address, 0), (Phone, 0),...}

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

4

2 回答 2

81

您可以使用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;
}
于 2013-03-06T16:06:09.367 回答
3

另一种方法是:

var dictionary = arr.ToDictionary(x => Array.IndexOf(arr, x));
于 2018-03-31T22:26:25.907 回答