不确定如何最好地表达这一点,这可能是我查找困难的原因。这是一个示例控制台应用程序,用于演示我的意思。
class Program
{
static void Main(string[] args)
{
var item1 = new Item("Number");
var item2 = new Item("Number");
var dict = new Dictionary<Item, string>();
dict.Add(item1, "Value");
Console.WriteLine(dict.ContainsKey(item2));
var dict2 = new Dictionary<string, string>();
dict2.Add("Number", "Value");
Console.WriteLine(dict2.ContainsKey("Number"));
Console.Read();
}
class Item
{
readonly string number;
public Item(string number)
{
this.number = number;
}
}
}
在此示例中,dict.ContainsKey(item2)
返回false
,dict2.ContainsKey("Number")
返回true
。可以通过这样的方式定义项目,使其行为像字符串一样吗?我能想到的最好的是
static void Main(string[] args)
{
var item1 = new Item("Number");
var item2 = new Item("Number");
var dict = new Dictionary<string, string>();
dict.Add(item1.ToString(), "Test");
Console.WriteLine(dict.ContainsKey(item2.ToString()));
Console.Read();
}
class Item
{
readonly string number;
public Item(string number)
{
this.number = number;
}
public override string ToString()
{
return number;
}
}
这个例子是设计的,Item会有更多的字段,而ToString()会将它们联合起来。
答案 0 :(得分:3)
您需要覆盖Equals
和GetHashCode
。 Dictionary
使用Equals
和GetHashCode
方法来比较相等的密钥。
class Item
{
readonly string number;
public Item(string number)
{
this.number = number;
}
public override bool Equals(object obj)
{
return Equals(obj as Item);
}
public override int GetHashCode()
{
// this is c# 6 feature
return number?.GetHashCode() ?? 0;
// If you are not using c# 6, you can use
// return number == null ? 0 : number.GetHashCode();
}
private bool Equals(Item another)
{
if (another == null)
return false;
return number == another.number;
}
}
如果您有多个字段,则需要考虑Equals
和GetHashCode
方法中的所有字段。