.NET类,用于快速查找基于Key的值,反之亦然

时间:2010-09-28 05:45:26

标签: .net dictionary

我经常使用Dictionary<TKey, TValue>类型来存储ehh ...字典类型的值,例如Key = 1, Value ="Canada"。但在许多情况下,字典数据中的值也是唯一的,就像Keys一样。我发现对于Dictionary<TKey, TValue>类型,根据值获取键值并不是很方便。

我的问题是,.NET中的哪个类适合这种情况?快速找出基于Key的值,反之亦然。

4 个答案:

答案 0 :(得分:4)

使用LINQ非常简单:

int key = new Dictionary<int,string>().Where((kv)=>kv.Value == "SomeValue").Select(kv=>kv.Key).FirstOrDefault();

如果您喜欢,可以使用扩展方法:

static class DictionaryExtensions {
    public static bool TryFindByValue<TKey, TValue>(this IDictionary<TKey, TValue> dict, TValue value, out TKey key) {
        var keys = dict.Where((kv) => kv.Value.Equals(value)).Select(kv => kv.Key);
        bool retValue = keys.Any();
        key = keys.FirstOrDefault();
        return retValue;
    }
}

您还可以做的是实现IDictionary,委托两个Dictionary对象(一个用于键值映射,一个用于值键映射)用于后备存储,并对{具有约束{1}}这些值必须是唯一的。这样,您可以保证最多只有一个具有特定值的条目。 编辑使用两个词典可以缩短访问时间(感谢@SamStephens),因为键和值都将存储在有序的哈希表中。

答案 1 :(得分:2)

不要认为.NET附带任何东西。可能有第三方课程。但是你可以很容易地构建你自己的类,它包含两个字典,一个键和值反转。

答案 2 :(得分:1)

(需要.NET 4.0)

var list = new List<Tuple<int, string>>
{
 new Tuple<int, string>(1, "Canada"),
 new Tuple<int, string>(2, "USA")
};

var i = list.FirstOrDefault(t => t.Item1 == 1);
var j = list.FirstOrDefault(t => t.Item2 == "USA");

答案 3 :(得分:0)

您可以使用两个词典来镜像词典,但这只有在值集合也是唯一的时才有效,这听起来很奇怪且不太可能。否则,您必须查询Values属性以获取正确的属性。

(
 from x in dict.Values
 where x.Prop == "someValue"
 select x
)
.FirstOrDefault()

或者,只是

dict.Values.FirstOrDefault(x => x.Prop == "someValue");