我想知道是否存在一些获取特定值索引的属性或方法。
我发现字典有Contains()
方法,如果传入的值存在则返回true,所以这个方法几乎实现了我需要的东西。
我知道我可以循环遍历所有的值对并检查条件,但我想问,因为可能有一种优化的方法。
答案 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中触及了这一点,一个值可能会在字典中出现多次,在这种情况下会有一个我必须考虑他想要获得哪个密钥:例如第一个出现,最后一个,所有这些?
如果您确定每个键都有唯一值,则可以使用另一个字典,其中第一个值用作键,而前一个键用作值。否则,第二个字典想法(suggested除Jon Skeet)将不起作用,因为您将再次考虑在新字典中使用哪个可能的键作为值。
如果您询问索引,那么,EricM的答案就可以了。然后你可以使用:
获得有问题的KeyValuePairyourDictionary.ElementAt(theIndexYouFound);
已提供您未在yourDictionary
中添加/删除内容。