如何根据元素键找到字典元素的索引?我正在使用以下代码来浏览字典:
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = ??????;
}
有人可以帮忙吗?
答案 0 :(得分:10)
Dictionary
中没有索引的概念。您无法依赖Dictionary
内的任何商品订单。 OrderedDictionary
可能是另一种选择。
var freq = new OrderedDictionary<string, int>();
// ...
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = GetIndex(freq, entry.Key);
}
public int GetIndex(OrderedDictionary<string, object> dictionary, string key)
{
for (int index = 0; index < dictionary.Count; index++)
{
if (dictionary.Item[index] == dictionary.Item[key])
return index; // We found the item
}
return -1;
}
答案 1 :(得分:6)
无法获取索引,因为数据以完全不同的方式存储在内存中,用于数组和字典。
当你声明任何类型的数组时,你知道,数据会一个接一个地放在内存单元格中。因此,index是内存地址的转换。
当您将数据放入字典时,您无法预测将用于此项目的地址,因为它将被放置在特定的空位置,这将为按键快速搜索提供平衡图形。因此,您无法使用索引操作字典数据。
P.S。我相信,您可以使用Linq来解决您的问题。
答案 2 :(得分:4)
这可能有用,这可能不是最有效的方法。我也不确定你为什么要这样的东西。
Int termIndex = Array.IndexOf(myDictionary.Keys.ToArray(), someKey);
答案 3 :(得分:3)
也许这样的事情可行:
public static int GetIndex(Dictionary<string, object> dictionary, string key)
{
for (int index = 0; index < dictionary.Count; index++)
{
if(dictionary.Skip(index).First().Key == key)
return index;
}
return -1;
}
基于Dennis Traub解决方案,但使用字典...(原始添加的是orderer)
答案 4 :(得分:3)
有2种扩展方法
按键索引
public static int IndexOf<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TKey key)
{
int i = 0;
foreach(var pair in dictionary)
{
if(pair.Key.Equals(key))
{
return i;
}
i++;
}
return -1;
}
按值索引
public static int IndexOf<TKey, TValue>(this Dictionary<TKey, TValue> dictionary, TValue value)
{
int i = 0;
foreach(var pair in dictionary)
{
if(pair.Value.Equals(value))
{
return i;
}
i++;
}
return -1;
}
答案 5 :(得分:1)
正如Dennis所说,字典中没有索引,但在你的例子中,foreach循环中的位置可以跟踪:
int index = -1;
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = ++index;
}
答案 6 :(得分:1)
它已经过时但有人可能会使用它 - 我目前正在使用
public static int OrderedDictIndexOfKey(string key, OrderedDictionary oDict)
{
int i = 0;
foreach (DictionaryEntry oDictEntry in oDict)
{
if ((string)oDictEntry.Key == key) return i;
i++;
}
return -1;
}
public static object OrderedDictKeyAtIndex(int index, OrderedDictionary oDict)
{
if (index < oDict.Count && index >= 0)
{
return oDict.Cast<DictionaryEntry>().ElementAt(index).Key;
}
else
{
return null;
}
}
答案 7 :(得分:0)
.NET哈希表中的字典实现没有定义的索引,因为它基于哈希键。我发现这里的答案是无效且缓慢的,因为许多这样的解决方案都没有保留O(1)词典数据结构的时间复杂性。与字典相比,有序字典在性能上有一些缺点。
唯一有效的解决方案是在构建字典时添加索引。 所以你应该有例如
Dictionary<string, Tuple <int, int >>
如果添加新的键值对,则在元组中的哪个位置添加索引。这个简单的解决方案保留了时间O(1),此外,您还可以拥有带有索引的属性。