将数组转换为字典,值作为项目的索引,键作为项目本身
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 => array[x], x => x);
最后一个选项可能是最有效的——但如果你明白我的意思,我不希望它们中的任何一个具有不同的底层复杂性。所以我可能会选择你认为最易读的任何东西,直到你有理由不这样做。【参考方案2】:
另一种方式是:
var dictionary = arr.ToDictionary(x => Array.IndexOf(arr, x));
【讨论】:
以上是关于将数组转换为字典,值作为项目的索引,键作为项目本身的主要内容,如果未能解决你的问题,请参考以下文章