如何根据元素键找到字典元素的索引?我正在使用以下代码来浏览字典:
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = ??????;
}
有人可以帮忙吗?
如何根据元素键找到字典元素的索引?我正在使用以下代码来浏览字典:
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = ??????;
}
有人可以帮忙吗?
中没有索引的概念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;
}
这可能有效,这可能不是最有效的方法。我也不确定你为什么想要这样的东西。
Int termIndex = Array.IndexOf(myDictionary.Keys.ToArray(), someKey);
无法获取索引,因为数组和字典以完全不同的方式存储在内存中的数据。
当您声明任何类型的数组时,您知道,这些数据将一个接一个地放置在内存单元中。因此,索引是内存地址的移位。
当您将数据放入字典时,您无法预测将用于该项目的地址,因为它将放置在特定的空位置,这将为按键快速搜索提供平衡图。因此,您不能使用索引来操作字典数据。
PS 我相信,您可以使用 Linq 解决您的问题。
有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;
}
也许这样的事情可以工作:
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 解决方案,但使用字典...(它是原始添加的排序器)
正如丹尼斯所说,字典中没有索引,但在您的示例中,可以这样跟踪 foreach 循环中的位置:
int index = -1;
foreach (var entry in freq)
{
var word = entry.Key;
var wordFreq = entry.Value;
int termIndex = ++index;
}
它很旧,但有人可能会使用它 - 我目前使用
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;
}
}
.NET 哈希表中的字典实现没有定义索引,因为它基于哈希键。我发现这里的答案效率低下且速度慢,因为这些解决方案中的许多都没有保留 O (1) Dictionary 数据结构的时间复杂度。与字典相比,有序字典有一些性能劣势。
唯一一次有效的可能解决方案是在构建字典时添加索引。所以你应该有例如
Dictionary<string, Tuple <int, int >>
如果添加新的键值对,您将在元组中添加索引的位置。这个简单的解决方案保留了时间 O (1),此外您还可以拥有一个带有索引的属性。