我经常使用Dictionary<TKey, TValue>
类型来存储ehh ...字典类型的值,例如Key = 1, Value ="Canada"
。但在许多情况下,字典数据中的值也是唯一的,就像Keys一样。我发现对于Dictionary<TKey, TValue>
类型,根据值获取键值并不是很方便。
我的问题是,.NET中的哪个类适合这种情况?快速找出基于Key的值,反之亦然。
答案 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");