C# 将数组转换为字典,值作为项的索引,键作为项本身

C# 将数组转换为字典,值作为项的索引,键作为项本身,c#,linq,dictionary,C#,Linq,Dictionary,我有一个数组,比如- arr[0] = "Name"; arr[1] = "Address"; arr[2] = "Phone"; ... 我想创建一个字典,这样数组值将是字典键,字典值将是索引,这样我就可以通过在O(1)中查询列的名称来获取列的索引。我知道这应该是相当简单的,但我无法理解它 我试过了- Dictionary<string, int> myDict = arr.ToDictionary(x => x, x => indexOf(x)) 我知道会发生这种

我有一个数组,比如-

arr[0] = "Name";
arr[1] = "Address";
arr[2] = "Phone";
...
我想创建一个
字典
,这样数组值将是字典键,字典值将是索引,这样我就可以通过在
O(1)
中查询列的名称来获取列的索引。我知道这应该是相当简单的,但我无法理解它

我试过了-

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

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

您可以使用
Select
的重载,其中包括索引:

var dictionary = array.Select((value, index) => new { value, index })
                      .ToDictionary(pair => pair.value, pair => pair.index);
或使用可枚举范围:

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;
}
var dictionary=newdictionary();
for(int i=0;i
另一种方法是:

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

很抱歉,但是为什么需要这样做呢?值得注意的是,如果存在重复的值,前两个将出错。他们可能首先想添加一个<代码>不同的< /代码>。@ Servy:我会添加一个注释,但是除了“你需要考虑这个”之外没有建议的解决方案:)第一个选项像一个符咒一样工作,第二个选项在数组[i](找不到i)NoDeV33第二上有一个错误。它应该是这样的:
Enumerable.Range(0,array.Length).ToDictionary(x=>array[x],x=>x)最后一个选项可能是最有效的-但是如果你明白我的意思的话,我不希望它们有不同的底层复杂性。所以我可能会选择你认为最容易阅读的东西,直到你有理由不这么做。
var dictionary = arr.ToDictionary(x => Array.IndexOf(arr, x));