我想知道是否存在某个属性或方法,可以获取特定值的索引。
我发现字典具有Contains()
方法,如果传入的值存在,则返回true,因此这种方法几乎实现了我需要的功能。
我知道可以循环遍历所有值对并检查条件,但我提问是因为可能有一种优化的方法来完成这个操作。
我想知道是否存在某个属性或方法,可以获取特定值的索引。
我发现字典具有Contains()
方法,如果传入的值存在,则返回true,因此这种方法几乎实现了我需要的功能。
我知道可以循环遍历所有值对并检查条件,但我提问是因为可能有一种优化的方法来完成这个操作。
假设你有一个名为fooDictionary的字典
fooDictionary.Values.ToList().IndexOf(someValue);
Values.ToList()将您的字典值转换为一些值对象的列表。
IndexOf(someValue)搜索您的新列表,寻找特定的someValue对象并返回匹配字典键/值对索引的索引。
此方法不关心字典键,只是返回您要查找的值的索引。
然而,这并不考虑可能存在多个匹配的"someValue"对象的问题。
在字典中,并不存在“索引”这样的概念——它本质上是无序的。当然,当您迭代字典中的项时,您会以某种顺序获取这些项,但是该顺序不能保证并且可能随时间改变(特别是如果添加或删除条目)。
显然,您可以通过使用 Key
属性从 KeyValuePair
中获取键,因此这将让您使用字典的索引器:
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。
这是基于键类型是引用类型的假设... 如果它是值类型,你需要稍微不同的操作。
当然,如果你真的想通过键查找值,你应该考虑使用另一个字典,除了现有的字典之外,还提供了另一种映射方式。
考虑使用 System.Collections.Specialized.OrderedDictionary
,尽管它不是泛型的,或者实现自己的(示例)。
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;
}
}
OrderedDictionary
,因为 Dictionary
没有索引。 - BrianDictionary<string, string> myDictionary = new Dictionary<string, string>();
myDictionary.Add("a", "x");
myDictionary.Add("b", "y");
int i = Array.IndexOf(myDictionary.Keys.ToArray(), "a");
int j = Array.IndexOf(myDictionary.Values.ToArray(), "y");
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
yourDictionary.ElementAt(theIndexYouFound);
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;
不,对于字典(Dictionary)来说没有类似于IndexOf的方法,但是你可以使用ContainsKey方法来判断一个键是否存在于字典中。