.NET类,用于根据键快速查找值,反之亦然

.NET类,用于根据键快速查找值,反之亦然,.net,dictionary,.net,Dictionary,我经常使用Dictionarytype来存储ehh…Dictionary类型的值,例如Key=1,Value=“Canada”。但在许多情况下,字典数据中的值也是唯一的,就像键一样。我发现对于字典类型,基于值获取键值不是很方便 我的问题是,.NET中的哪个类适合这种情况?根据键快速找出值,反之亦然。不要认为.NET附带了任何东西。可能有第三方课程。但是,您可以非常轻松地构建自己的类,该类包含两个字典,其中一个具有相反的键和值。您可以通过使用两个字典来镜像字典,但这仅在值集合也是唯一的情况下才起作

我经常使用
Dictionary
type来存储ehh…Dictionary类型的值,例如
Key=1,Value=“Canada”
。但在许多情况下,字典数据中的值也是唯一的,就像键一样。我发现对于
字典
类型,基于值获取键值不是很方便


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

不要认为.NET附带了任何东西。可能有第三方课程。但是,您可以非常轻松地构建自己的类,该类包含两个字典,其中一个具有相反的键和值。

您可以通过使用两个字典来镜像字典,但这仅在值集合也是唯一的情况下才起作用,这听起来很奇怪,也不太可能。否则,您必须查询Values属性以获得正确的值

(
 from x in dict.Values
 where x.Prop == "someValue"
 select x
)
.FirstOrDefault()
或者,简单地说

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

这在使用LINQ时非常简单:

int key = new Dictionary<int,string>().Where((kv)=>kv.Value == "SomeValue").Select(kv=>kv.Key).FirstOrDefault();
int key=new Dictionary()。其中((kv)=>kv.Value==“SomeValue”)。选择(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;
    }
}
静态类字典扩展{
公共静态bool TryFindByValue(此IDictionary dict、TValue value、out TKey){
var keys=dict.Where((kv)=>kv.值等于(值))。选择(kv=>kv.键);
bool retValue=keys.Any();
key=keys.FirstOrDefault();
返回值;
}
}
您还可以实现
IDictionary
,将两个
字典
对象(一个用于键值映射,一个用于值键映射)委托给备份存储,并对
添加
设置一个值必须唯一的约束。这样可以保证最多有一个具有特定值的条目编辑使用两个字典将缩短访问时间(感谢@SamStephens),因为键和值都将存储在有序的哈希表中。

(需要.NET 4.0)

var list=新列表
{
新元组(1,“加拿大”),
新元组(2,“美国”)
};
var i=list.FirstOrDefault(t=>t.Item1==1);
var j=list.FirstOrDefault(t=>t.Item2==“美国”);

.FirstOrDefault(p=>p.Value==“SomeValue”).Key相同但我的速度要快得多。(在这两种情况下都需要额外的空检查)取消对
.FirstOrDefault(p=>p.Value==“SomeValue”).Key中的键的引用将崩溃。更安全的做法是将
FirstOrDefault()
放在fluent链的末尾。它没有通过Key@SamStephens是的,没错。我也会更新答案的。我希望我能用+2来表示元组没有键访问字典的速度
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");