我创建了一个并用-键值对System.Collections.Generic.Dictionary
d
填充它。int
string
给定一个键k
,我可以通过调用d[k]
.
但是,我怎样才能实现相反的效果?也就是说,给定一个 value v
,我怎样才能获得它的 key?
我创建了一个并用-键值对System.Collections.Generic.Dictionary
d
填充它。int
string
给定一个键k
,我可以通过调用d[k]
.
但是,我怎样才能实现相反的效果?也就是说,给定一个 value v
,我怎样才能获得它的 key?
一种选择是遍历所有对以找到具有您要查找的值的对,然后从这些对中获取密钥。如果您愿意搜索整个字典并且没有快速的查找速度,那么这将是合适的。
如果这是你经常做的事情,那么这表明你的字典是“向后”的,它应该被颠倒,或者你应该有字典,一个用于“向前”查找,一个用于“向后”查找“ 抬头。这样做会使程序的内存占用增加一倍,并且复杂性会显着增加(您需要确保两个集合保持同步)。你可以找到一些现有的“双向字典”解决方案(即Jon Skeet 的这个),它将这两个字典封装在一个类中(这样你就不需要做这些工作来确保它们保持同步; 操作将改变两个字典)。如果这是您经常做的事情,请考虑使用或制作这样的类型。
您将拥有多个具有特定值的键,因此只需使用 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];
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();
}
执行以下操作就足够了:
var dic = new Dictionary<int, string>() {....}
var foundKey = dic.FirstOrDefault(kvp=>kvp.Value == YOUR_SEARCH_VALUE_HERE).Key;
var key = dictionary.FirstOrDefault(d => d.Value == value).Key;
你可以这样做:
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;
var key = dictionary.FirstOrDefault(d => d.Value == value).Key;
是的,您可以使用 d[k] 但不要忘记使用d.ContainsKey(k)
,否则会出现异常。你可以use var key = d.FirstOrDefault(x => x.Value == value).Key;