我声明了一个可变类,它可以替代元组作为字典的键。原因是序列化。序列化工作得很好。出现以下问题,我在使用此类时收到“KeyNotFoundException”,但前提是使用此类的新实例进行查找。为了更清楚地说明这一点,请参阅以下类定义:
public class STuple<T1, T2> {
public T1 Item1 { get; set; }
public T2 Item2 { get; set; }
public static implicit operator Tuple<T1, T2>(STuple<T1, T2> st)
{
return Tuple.Create(st.Item1, st.Item2);
}
public static implicit operator STuple<T1, T2>(Tuple<T1, T2> t)
{
return new STuple<T1, T2>()
{
Item1 = t.Item1,
Item2 = t.Item2,
};
}
public STuple()
{
}
public STuple(T1 t1, T2 t2) : this()
{
Item1 = t1;
Item2 = t2;
}
}
这是示例程序:
Dictionary<Tuple<string, string>, double> TupleDic = new Dictionary<Tuple<string, string>, double>();
TupleDic.Add(new Tuple<string, string>("Name1", "Name2"), 5);
TupleDic.Add(new Tuple<string, string>("Name3", "Name4"), 10);
Console.WriteLine("dict-Entry 1: {0}", TupleDic[new Tuple<string, string>("Name1", "Name2")]);
Console.WriteLine("dict-Entry 2: {0}", TupleDic[new Tuple<string, string>("Name3", "Name4")]);
Dictionary<STuple<string, string>, double> STupleDic = new Dictionary<STuple<string, string>, double>();
STuple<string, string> STuple1 = new STuple<string, string>("Name1", "Name2");
STuple<string, string> STuple2 = new STuple<string, string>("Name3", "Name4");
STupleDic.Add(STuple1, 5);
STupleDic.Add(STuple2, 10);
//Still working
Console.WriteLine();
Console.WriteLine("Sdict-Entry 1: {0}", STupleDic[STuple1]);
Console.WriteLine("Sdict-Entry 2: {0}", STupleDic[STuple2]);
//Not working
STuple<string, string> STuple3 = new STuple<string, string>("Name1", "Name2");
STuple<string, string> STuple4 = new STuple<string, string>("Name3", "Name4");
Console.WriteLine();
Console.WriteLine("Sdict-Entry 1: {0}", STupleDic[STuple3]);
Console.WriteLine("Sdict-Entry 2: {0}", STupleDic[STuple4]);
Console.ReadKey();
使用普通元组的示例工作得很好,但是当我使用我自己的类 STuple 时,它只有在我使用与添加所用的完全相同的键(相同的实例)时才有效。我是一个完全的初学者,是否有可能因为值类型和引用类型的一些混淆而出现问题?
在我看来真的很奇怪,使用 foreach 查找仍然有效:
Console.WriteLine();
foreach (KeyValuePair<STuple<string, string>, double> s in STupleDic)
{
Console.WriteLine("Sdict-Entry 1: {0}", s.Value);
}