根据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"))
返回null
,values.TryGetValue(new Tuple<string, string>("1", "2"), out value);
找到正确的密钥并返回值?
答案 0 :(得分:8)
你正在使用==
,Tuple<,>
没有超载,所以它正在使用引用标识检查...并且当你构建了一个新的元组时,从来没有是真的。
这将正确,但不受欢迎:
// Don't do this!
values.FirstOrDefault(x => new Tuple<string, string>("1", "2").Equals(x.Key))
那会: