C#包含元组上的密钥

Bad*_*ral 1 c# dictionary class

我有一个字典,它接受一个元组函数和一个int

Dictionary<Tuple<string,string>, int> fullNames = new Dictionary<Tuple<string,string>, int>();
Run Code Online (Sandbox Code Playgroud)

将Tuple类定义为

public class Tuple<T, T2> 
{ 
    public Tuple(T first, T2 second) 
    { 
        First = first; 
        Second = second; 
    } 
    public T First { get; set; } 
    public T2 Second { get; set; } 

}
Run Code Online (Sandbox Code Playgroud)

我想这样使用Containskey函数

if (fullNames.ContainsKey(Tuple<"firstname","lastname">))
Run Code Online (Sandbox Code Playgroud)

但我收到过载错误.有什么建议?

Tej*_*ejs 6

您提供的代码无效,因为您尝试在实际对象所在的位置提供类型定义(并且类型定义也是无效的,因为字符串实际上不是System.String泛型期望的类型).如果元组是字典的键值,那么您可以这样做:

if(fullNames.ContainsKey(new Tuple<string, string>("firstname", "lastname")))
Run Code Online (Sandbox Code Playgroud)

但是,由于在具有相同属性的内存中创建的两个元组不一定是同一个对象,因此您可能会遇到引用相等问题.这样做会更好:

Tuple<string, string> testTuple = new Tuple<string, string>("firstname", "lastname");
if(fullNames.Keys.Any(x => x.First == testTuple.First && x.Second == testTuple.Second))
Run Code Online (Sandbox Code Playgroud)

这将告诉您是否存在共享相同属性数据的密钥.然后访问该元素将同样复杂.

编辑:简而言之,如果您打算使用引用类型作为键,您需要确保您的对象实现EqualsGetHashCode以正确的方式识别两个独立的内存实例是相同的.

  • 另外值得一提的是,当使用.NET 4中包含的Tuple类型时,`Equals`和`GetHashCode`按预期实现. (3认同)