根据值获取C#字典中键/值对的索引

时间:2010-12-27 13:12:53

标签: c# dictionary key-value

我想知道是否存在一些获取特定值索引的属性或方法。

我发现字典有Contains()方法,如果传入的值存在则返回true,所以这个方法几乎实现了我需要的东西。

我知道我可以循环遍历所有的值对并检查条件,但我想问,因为可能有一种优化的方法。

8 个答案:

答案 0 :(得分:31)

字典中没有“索引”这样的概念 - 它基本上是无序的。当然,当你迭代它时,你会得到一些顺序中的项目,但是这个顺序不能保证并且可以随着时间而改变(特别是如果你添加或删除条目)。

显然,只需使用KeyValuePair属性就可以从Key获取密钥,这样就可以使用字典的索引器了:

var pair = ...;
var value = dictionary[pair.Key];
Assert.AreEqual(value, pair.Value);

你还没有真正说出你想要做的事情。如果您正在尝试查找与特定值对应的某个键,则可以使用:

var key = dictionary.Where(pair => pair.Value == desiredValue)
                    .Select(pair => pair.Key)
                    .FirstOrDefault();
如果条目不存在,

key将为null。

这假设键类型是引用类型...如果它是值类型,则需要稍微改变一些。

当然,如果你真的想按键查找值,你应该考虑使用另一个字典,除了你现有的字典之外,它会反过来映射。

答案 1 :(得分:20)

假设您有一个名为fooDictionary的词典

fooDictionary.Values.ToList().IndexOf(someValue);

Values.ToList() 将您的字典值转换为someValue对象的列表。

的IndexOf(someValue中) 搜索新列表,查找有问题的someValue对象 并返回与字典中键/值对的索引匹配的索引。

此方法不关心字典键,只返回您要查找的值的索引。

但是,这并不能解决可能存在多个匹配的“someValue”对象的问题。

答案 2 :(得分:9)

考虑使用System.Collections.Specialized.OrderedDictionary,虽然它不是通用的,或者实现自己的example

OrderedDictionary不支持IndexOf,但它很容易实现:

public static class OrderedDictionaryExtensions
{
    public static int IndexOf(this OrderedDictionary dictionary, object value)
    {
        for(int i = 0; i < dictionary.Count; ++i)
        {
            if(dictionary[i] == value) return i;
        }
        return -1;
    }
}

答案 3 :(得分:2)

您可以使用LINQ来帮助您。

Dictionary<int, string> dict = new Dictionary<int, string>();
dict.Add(1, "hi");
dict.Add(2, "NotHi");
dict.Add(3, "Bah");

var item = (from d in dict
            where d.Value == "hi"
            select d.Key).FirstOrDefault();

Console.WriteLine(item); //Prints 1

答案 4 :(得分:1)

如果要搜索值,则必须遍历所有数据。但为了最大限度地减少相关代码,您可以使用 LINQ

实施例

给定字典定义如下:

Dictionary<Int32, String> dict;

您可以使用以下代码:

// Search for all keys with given value
Int32[] keys = dict.Where(kvp => kvp.Value.Equals("SomeValue")).Select(kvp => kvp.Key).ToArray();

// Search for first key with given value
Int32 key = dict.First(kvp => kvp.Value.Equals("SomeValue")).Key;

答案 5 :(得分:1)

    You can find index by key/values in dictionary
let image = UIImage(named: "house")

答案 6 :(得分:0)

不,虽然你可以利用ContainsKey方法来获取一个键是否属于字典,但是没有类似的IndexOf for Dictionary

答案 7 :(得分:0)

在你对max answer的评论中,你说你真正想要的是,而不是索引,包含特定值的KeyValuePair。您可以编辑问题以使其更清晰。

值得指出的是(EricM已经在他的answer中触及了这一点,一个值可能会在字典中出现多次,在这种情况下会有一个我必须考虑他想要获得哪个密钥:例如第一个出现,最后一个,所有这些?

如果您确定每个键都有唯一值,则可以使用另一个字典,其中第一个值用作键,而前一个键用作值。否则,第二个字典想法(suggestedJon Skeet)将不起作用,因为您将再次考虑在新字典中使用哪个可能的键作为值。

如果您询问索引,那么,EricM的答案就可以了。然后你可以使用:

获得有问题的KeyValuePair
yourDictionary.ElementAt(theIndexYouFound);

已提供您未在yourDictionary中添加/删除内容。

PS:我知道它已经差不多7年了,但是到底是什么。我认为最好将我的答案表达为解决OP,但当然现在可以说这是其他任何人的答案但是 OP。完全了解这一点,谢谢。