Если вы хотите метод .Contains соответствовать только CPlayer.Имя, то в классе 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
сравнения быть Case Нечувствительностью, заменить использование этого Равны методы вместо:
public override bool Equals(object obj)
{
if (!(obj is CPlayer)
return false;
return Name.Equals((obj as CPlayer).Name, StringComparison.OrdinalIgnoreCase);
}
Если вы сделаете это, ваш. Содержит вызов, который будет работать так, как вы этого хотите. Во-вторых, если вы хотите, чтобы выбрать этот пункт в списке, выполните следующие действия:
var playerB = ListB[ListB.IndexOf(player)];
Он использует те же .equals и методы .GetHashCode.
UPD: Это, вероятно, субъективное мнение, но вы также можете выжать производительность из него, если ваш метод .equals сравнил Int хэши перед выполнением сравнения строк ..
Глядя на Источники .NET (Reflector FTW) Я вижу, что, по-видимому, только класс HastTable использует GetHashCode для повышения производительности, вместо использования .Equals для сравнения объектов каждый раз. В случае такого маленького класса сопоставитель равен простое сравнение строк. Если бы вы сравнивали все свойства, то сравнение двух целых чисел было бы намного быстрее (esp, если они были кэшированы :))
List.Contains и List.IndexOf не используют хеш-код и используют метод .Equals, поэтому я предложил проверить хэш-код внутри. Это, вероятно, не будет ничего заметного, но когда вы испытываете зуд, чтобы получить каждый миллисекунд исполнения (не всегда хорошая вещь, ошибка hey!: P), это может помочь кому-то. просто говоря ... :)
.NET 2.0 к сожалению – Matt
@Matt: теперь добавлено возможное решение для .NET 2.0. –