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

Posted

技术标签:

【中文标题】将数组转换为字典,值作为项目的索引,键作为项目本身【英文标题】: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),...

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

【问题讨论】:

抱歉,您为什么需要这样呢? 【参考方案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));

【讨论】:

以上是关于将数组转换为字典,值作为项目的索引,键作为项目本身的主要内容,如果未能解决你的问题,请参考以下文章

将字典中的数组转换为数组列表

通过将键作为列将 json 字典转换为 spark 数据帧

Pandas:如何将具有重复索引值的数据框转换为字典

如何在 C# 字典中按值索引过滤项目?

交叉两个字典

解压熊猫数据框字典 (1,1)