Если вы хотите, чтобы метод .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, поэтому я предложил проверить хеш-код внутри. Это, вероятно, не будет ничего заметного, но когда вы жаждете получить каждую мс выполнения (не всегда хорошая вещь, ошибка, эй!: P), это может кому-то помочь. просто говорю ...:)