如何进行字典反向查找

fre*_*hie 18 c#

我有一个类型字典,<string, string>对于特定情况,我需要进行反向查找.所以例如假设我有这个条目<"SomeString", "ab">并且我传入"ab"然后我想返回"SomeString".在我对foreach字典中的每个条目进行循环之前,我想知道进行此反向查找的最有效方法是什么?

Sel*_*enç 33

基本上,你可以使用LINQ并得到Key这样的,而不会反转任何东西:

var key = dictionary.FirstOrDefault(x => x.Value == "ab").Key;
Run Code Online (Sandbox Code Playgroud)

如果你真的想要反转你的词典,你可以使用这样的扩展方法:

public static Dictionary<TValue, TKey> Reverse<TKey, TValue>(this IDictionary<TKey, TValue> source)
{
     var dictionary = new Dictionary<TValue, TKey>();
     foreach (var entry in source)
     {
         if(!dictionary.ContainsKey(entry.Value))
             dictionary.Add(entry.Value, entry.Key);
     }
     return dictionary;
} 
Run Code Online (Sandbox Code Playgroud)

然后你可以像这样使用它:

var reversedDictionary = dictionary.Reverse();
var key = reversedDictionary["ab"];
Run Code Online (Sandbox Code Playgroud)

注意:如果您有重复值,则此方法将添加第一个 Value并忽略其他值.

  • ......`Reverse`在{1 =>"a",2 =>"a"}上崩溃. (4认同)
  • 可以说是更好的代码,但不比"for-each"更有效. (3认同)
  • "反向"是一个可怕的名字,这个方法根本不会扭转任何东西!`Flip`或`Swap`或`Switch`会更有意义. (3认同)
  • 反向是O(n) - 为什么执行O(n)以避免和O(n).这样做的方法是一个兼顾并同时添加到两者的Collection. (2认同)
  • 所有返回具体化集合的 LINQ 方法都被命名为“ToSomething”(“ToArray”、“ToList”、“ToDictionary”、“ToHashSet”)。我所说的具体化是指不延期。因此,为了符合惯例,可以将其命名为“ΤοReverseDictionary”。 (2认同)

Ism*_*yel 28

使用Linq ToDictionary功能:

var reversed = d.ToDictionary(x => x.Value, x => x.Key);
Run Code Online (Sandbox Code Playgroud)

您可以在下面看到它的工作原理,在Linqpad中进行了测试:

var d = new Dictionary<int, string>();
d.Add(1,"one");
d.Add(2,"two");
d.Dump(); //prints it out in linq-pad
var reversed = d.ToDictionary(x => x.Value, x => x.Key);
reversed.Dump(); //prints it out in linq-pad
Run Code Online (Sandbox Code Playgroud)

打印

  • 它在linq-pad中打印出来的东西,有点扩展的Console.Write ..已经提到代码是在linq-pad中测试的? (4认同)
  • 转储不是内置方法.您应该记录它的作用. (2认同)
  • 也许问题是如果你没有唯一的值......比如Key=3,Value=“two”,这会抛出异常。 (2认同)

Cha*_*lie 6

如何使用 linq 函数 ToDictionary:

var reversedDictionary = dictionary.ToDictionary(x => x.Value, x => x.Key);
Run Code Online (Sandbox Code Playgroud)

  • 一年前发布了一个字面上相同的答案。 (2认同)
  • 哦耶。不过我更喜欢我的。 (2认同)