根据item.key获取字典项的索引

时间:2012-11-21 09:10:08

标签: c#

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

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

有人可以帮忙吗?

8 个答案:

答案 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),此外,您还可以拥有带有索引的属性。