-1

我创建了一个并用-键值对System.Collections.Generic.Dictionary d填充它。intstring

给定一个键k,我可以通过调用d[k].

但是,我怎样才能实现相反的效果?也就是说,给定一个 value v,我怎样才能获得它的 key?

4

9 回答 9

5

一种选择是遍历所有对以找到具有您要查找的值的对,然后从这些对中获取密钥。如果您愿意搜索整个字典并且没有快速的查找速度,那么这将是合适的。

如果这是你经常做的事情,那么这表明你的字典是“向后”的,它应该被颠倒,或者你应该有字典,一个用于“向前”查找,一个用于“向后”查找“ 抬头。这样做会使程序的内存占用增加一倍,并且复杂性会显着增加(您需要确保两个集合保持同步)。你可以找到一些现有的“双向字典”解决方案(即Jon Skeet 的这个),它将这两个字典封装在一个类中(这样你就不需要做这些工作来确保它们保持同步; 操作将改变两个字典)。如果这是您经常做的事情,请考虑使用或制作这样的类型。

于 2013-07-08T15:42:10.533 回答
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];
于 2013-07-08T15:40:32.037 回答
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();
}
于 2013-07-08T15:46:29.570 回答
0

执行以下操作就足够了:

var dic = new Dictionary<int, string>() {....}
var foundKey = dic.FirstOrDefault(kvp=>kvp.Value == YOUR_SEARCH_VALUE_HERE).Key;
于 2013-07-08T15:41:14.807 回答
0
var key = dictionary.FirstOrDefault(d => d.Value == value).Key;
于 2013-07-08T15:41:29.783 回答
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将采用类型的默认值TKeynull对于字符串或其他类,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;
于 2013-07-08T15:41:43.577 回答
0
var key = dictionary.FirstOrDefault(d => d.Value == value).Key;
于 2013-07-08T15:41:51.137 回答
0

是的,您可以使用 d[k] 但不要忘记使用d.ContainsKey(k),否则会出现异常。你可以use var key = d.FirstOrDefault(x => x.Value == value).Key;

于 2013-07-08T15:43:11.873 回答
0

如果这是您经常做的事情,或者如果您想确保每个值只添加一次,您应该创建一个自定义数据类型,其中包含两个字典:一个<int,string>和另一个<string,int>。您可以像使用任何一种类型的普通字典一样与它交互。类声明可能如下所示:

public class DoubleDictionary<T1, T2> : IDictionary<T1, T2>, IDictionary<T2, T1>

Jon Skeet 创建了这样一个字典的完整实现,每个键没有多个值。

于 2013-07-08T15:43:44.937 回答