dictionary.TryGetValue vs FirstOrDefault

时间:2016-02-03 08:57:57

标签: c# linq dictionary compare tuples

根据MSDN documentation,一个元组对象Equals方法将使用两个Tuple对象的值。

为什么以下内容不会产生相同的结果:

[Test]
public void TestTupleWithDictionary() 
{
    Dictionary<Tuple<string, string>, string> values = new Dictionary<Tuple<string, string>, string>();

    values.Add(new Tuple<string, string>("1", "1"), "Item 1");
    values.Add(new Tuple<string, string>("1", "2"), "Item 2");

    Assert.IsNotNull(values.FirstOrDefault(x => x.Key == new Tuple<string, string>("1", "2")));

    string value;
    values.TryGetValue(new Tuple<string, string>("1", "2"), out value);

    Assert.IsNotNullOrEmpty(value);
}

为什么values.FirstOrDefault(x => x.Key == new Tuple<string, string>("1", "2"))返回nullvalues.TryGetValue(new Tuple<string, string>("1", "2"), out value);找到正确的密钥并返回值?

1 个答案:

答案 0 :(得分:8)

你正在使用==Tuple<,>没有超载,所以它正在使用引用标识检查...并且当你构建了一个新的元组时,从来没有是真的。

这将正确,但不受欢迎:

// Don't do this!
values.FirstOrDefault(x => new Tuple<string, string>("1", "2").Equals(x.Key))

那会:

  • 在每次迭代时创建一个新元组
  • 必须查看每个条目,直到找到匹配的一个,这是O(N)操作...与字典查找的正常O(1)操作进行比较