我创建了一个System.Collections.Generic.Dictionary
d
,并使用int
- string
键值对填充了它。
给定一个键k
,我可以通过调用d[k]
来获取其值。
然而,我怎样才能实现相反?也就是说,给定值v
,我如何获得其密钥?
答案 0 :(得分:5)
一个选项是迭代所有对,找到具有您正在寻找的值的那个,然后从这些对中获取密钥。如果您愿意搜索整个字典并且没有快速查找速度,那么这是合适的。
如果这是你正在做的事情,那么它表明你的字典是“向后”的,它应该被颠倒,或者你应该做一个字典,一个用于“转发”查找,一个用于“向后”查找。这样做会使程序的内存占用量增加一倍,并且复杂性也会显着增加(您需要确保两个集合保持同步)。您可以找到一些“双向字典”(即this one by Jon Skeet)的现有解决方案,这些解决方案将这两个字典封装在一个类中(这样您就不需要进行工作以确保它们保持同步;操作将改变两个词典)。如果这是你做了很多事情,可以考虑使用或制作这样的类型。
答案 1 :(得分:2)
您将拥有多个具有特定值的键,因此只需使用LINQ即可获得结果:
var keys = dic.Where(p => p.Value == v)
.Select(p => p.Key);
要提高访问性能,可以创建反向字典:
var inverseDic = dic.GroupBy(p => p.Value)
.ToDictionary(g => g.Key,
g => g.Select(p => p.Key));
所以,要获得钥匙:
var keys = inverseDic[v];
答案 2 :(得分:2)
public int[] GetKeys(string value)
{
List<int> list = new List<int>();
for(int i = 0;i<dict.Values.Count;i++)
{
if(dict.Values[i] == value){list.Add(dict.Keys[i]);}
}
return list.ToArray();
}
答案 3 :(得分:0)
应该做的事情就足够了:
var dic = new Dictionary<int, string>() {....}
var foundKey = dic.FirstOrDefault(kvp=>kvp.Value == YOUR_SEARCH_VALUE_HERE).Key;
答案 4 :(得分:0)
var key = dictionary.FirstOrDefault(d => d.Value == value).Key;
答案 5 :(得分:0)
你可以这样做:
var dict = new Dictionary<TKey, TValue>() ...
TValue myValue = ...
var myKey = dict.First(pair => pair.Value == myValue).Key;
如果在字典中找不到该值,则可能会失败。为了更安全一点,你可以这样做:
var myKey = dict.FirstOrDefault(pair => pair.Value == myValue).Key;
此处myKey
将采用类型TKey
的默认值(null
表示字符串或其他类,0
表示整数等。)因此,具体取决于您的具体情况你可能需要注意如何处理这种情况。
此外,重要的是要意识到您可以拥有许多具有相同值的键。要选择所有键,请使用以下命令:
var myKeys = dict.Where(pair => pair.Value == myValue).Select(pair => pair.Key);
或者在查询语法中:
var myKeys =
from pair in dict
where pair.Value == myValue
select pair.Key;
答案 6 :(得分:0)
var key = dictionary.FirstOrDefault(d => d.Value == value).Key;
答案 7 :(得分:0)
是的你可以使用d [k]但不要忘记使用d.ContainsKey(k)
或者你得到例外。你可以use var key = d.FirstOrDefault(x => x.Value == value).Key;
答案 8 :(得分:0)