词典:从价值中获取关键词

时间:2013-07-08 15:37:53

标签: c# dictionary

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

给定一个键k,我可以通过调用d[k]来获取其值。

然而,我怎样才能实现相反?也就是说,给定值v,我如何获得其密钥?

9 个答案:

答案 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)

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

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

Jon Skeet为每个键创建了这样一个词典的完整实现,withwithout多个值。