【问题标题】:Convert an array to dictionary with value as index of the item and key as the item itself将数组转换为字典,值作为项目的索引,键作为项目本身
【发布时间】:2013-03-06 16:04:21
【问题描述】:

我有一个数组,比如 -

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),...}

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

【问题讨论】:

  • 抱歉,您为什么需要这样呢?

标签: c# linq dictionary


【解决方案1】:

您可以使用包含索引的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;
}

【讨论】:

  • 值得注意的是,如果有重复的值,前两个会报错。他们可能想先添加Distinct
  • @Servy:我会添加一个注释,但除了“你需要考虑这个”之外没有建议的解决方案:)
  • 第一个选项就像一个魅力,第二个在数组 [i] 上出现错误(找不到 i)
  • @neuDev33 第二个有错字。应该是这样的:Enumerable.Range(0, array.Length).ToDictionary(x =&gt; array[x], x =&gt; x);
  • 最后一个选项可能是最有效的——但如果你明白我的意思,我不希望它们中的任何一个具有不同的底层复杂性。所以我可能会选择你认为最易读的任何东西,直到你有理由不这样做。
【解决方案2】:

另一种方式是:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-24
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-28
    相关资源
    最近更新 更多