如果您希望 .Contains 方法仅在 CPlayer.Name 上匹配,则在 CPlayer 类中实现这些方法:
public override bool Equals(object obj)
{
if (!(obj is CPlayer)
return false;
return Name == (obj as CPlayer).Name;
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
如果您希望Name
比较不区分大小写,请改为使用此 Equals 方法:
public override bool Equals(object obj)
{
if (!(obj is CPlayer)
return false;
return Name.Equals((obj as CPlayer).Name, StringComparison.OrdinalIgnoreCase);
}
如果您这样做,您的 .Contains 调用将按您的意愿工作。其次,如果要在列表中选择此项,请执行以下操作:
var playerB = ListB[ListB.IndexOf(player)];
它使用相同的 .Equals 和 .GetHashCode 方法。
UPD:
这可能是一个主观陈述,但如果您的 .Equals 方法在进行字符串比较之前比较了 Int 哈希值,您也可以从中挤出一些性能。
查看 .NET 源代码(Reflector FTW),我可以看到似乎只有 HastTable 类使用 GetHashCode 来提高其性能,而不是使用 .Equals 来每次比较对象。在像这样的小类的情况下,相等比较器很简单,一个单一的字符串比较..如果你正在比较所有属性,那么比较两个整数会快得多(尤其是如果它们被缓存:))
List.Contains 和 List.IndexOf 不使用哈希码,而是使用 .Equals 方法,因此我建议检查里面的哈希码。它可能不会有什么明显的,但是当你渴望得到每一个毫秒的执行时(并不总是一件好事,bug 嘿!:P)这可能会对某人有所帮助。只是说... :)