15

如何根据元素键找到字典元素的索引?我正在使用以下代码来浏览字典:

foreach (var entry in freq)
{
    var word = entry.Key;
    var wordFreq = entry.Value;
    int termIndex = ??????;
}

有人可以帮忙吗?

4

8 回答 8

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;
}
于 2012-11-21T09:12:08.127 回答
7

这可能有效,这可能不是最有效的方法。我也不确定你为什么想要这样的东西。

Int termIndex = Array.IndexOf(myDictionary.Keys.ToArray(), someKey);
于 2017-03-31T14:37:26.160 回答
6

无法获取索引,因为数组和字典以完全不同的方式存储在内存中的数据。

当您声明任何类型的数组时,您知道,这些数据将一个接一个地放置在内存单元中。因此,索引是内存地址的移位。

当您将数据放入字典时,您无法预测将用于该项目的地址,因为它将放置在特定的空位置,这将为按键快速搜索提供平衡图。因此,您不能使用索引来操作字典数据。

PS 我相信,您可以使用 Linq 解决您的问题。

于 2012-11-21T09:41:08.540 回答
4

有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;
    }
于 2016-10-26T13:25:38.993 回答
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 解决方案,但使用字典...(它是原始添加的排序器)

于 2015-09-10T20:43:10.393 回答
1

正如丹尼斯所说,字典中没有索引,但在您的示例中,可以这样跟踪 foreach 循环中的位置:

int index = -1;
foreach (var entry in freq)
            {

                var word = entry.Key;
                var wordFreq = entry.Value;
                int termIndex = ++index;


            }
于 2012-11-21T09:15:06.133 回答
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;
    }
}
于 2017-03-23T11:44:34.923 回答
0

.NET 哈希表中的字典实现没有定义索引,因为它基于哈希键。我发现这里的答案效率低下且速度慢,因为这些解决方案中的许多都没有保留 O (1) Dictionary 数据结构的时间复杂度。与字典相比,有序字典有一些性能劣势。

唯一一次有效的可能解决方案是在构建字典时添加索引。所以你应该有例如

Dictionary<string, Tuple <int, int >>

如果添加新的键值对,您将在元组中添加索引的位置。这个简单的解决方案保留了时间 O (1),此外您还可以拥有一个带有索引的属性。

于 2020-03-05T13:27:35.770 回答