1

我有一个字典,它包含一个元组函数和一个 int

Dictionary<Tuple<string,string>, int> fullNames = new Dictionary<Tuple<string,string>, int>();

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; } 

}

我想这样使用 Containskey 函数

if (fullNames.ContainsKey(Tuple<"firstname","lastname">))

但我收到一个过载错误。有什么建议么?

4

5 回答 5

6

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

if(fullNames.ContainsKey(new Tuple<string, string>("firstname", "lastname")))

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

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

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

编辑:长话短说,如果您打算为您的密钥使用引用类型,您需要确保您的对象实现EqualsGetHashCode以正确识别内存中两个独立实例的方式相同。

于 2012-04-25T17:08:35.547 回答
4
if (fullNames.ContainsKey(new Tuple<string, string> ("firstname", "lastname")))
{ /* do stuff */ }
于 2012-04-25T17:08:47.687 回答
4

为了Tuple在 Dictionary<> 中使用您的 as 键,您需要正确实现方法GetHashCodeEquals

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; }

    public override int GetHashCode()
    {
      return First.GetHashCode() ^ Second.GetHashCode();
    }

    public override Equals(object other)
    {
       Tuple<T, T2> t = other as Tuple<T, T2>;
       return t != null && t.First.Equals(First) && t.Second.Equals(Second);
    }

}

否则,通过引用完成密钥相等检查。具有这样的效果new Tuple("A", "B") != new Tuple("A", "B")

有关哈希码生成的更多信息: 覆盖 System.Object.GetHashCode 的最佳算法是什么?

于 2012-04-25T17:09:47.497 回答
1

.Net 4.0 有一个Tuple类型,它适用于您的情况,因为该Equal方法被重载以使用Equal您的类型中的 。

Dictionary<Tuple<string, string>, int> fullNames = 
    new Dictionary<Tuple<string, string>, int>();
fullNames.Add(new Tuple<string, string>("firstname", "lastname"), 1);
Console.WriteLine(fullNames.ContainsKey(
    new Tuple<string, string>("firstname","lastname"))); //True
于 2012-04-25T17:09:08.780 回答
0
Tuple<type,type> tuple = new Tuple("firsdtname", "lastname")

您已编写代码来创建未知类型的元组实例。

于 2012-04-25T17:08:47.060 回答