.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) を見ると、.Equals を使用して毎回オブジェクトを比較するのではなく、HastTable クラスだけが GetHashCode を使用してパフォーマンスを改善しているように見えることがわかります。このような小さなクラスの場合、等値比較子は単純で、単一の文字列比較です..ただし、すべてのプロパティを比較していた場合、2 つの整数を比較する方がはるかに高速です (特に、それらがキャッシュされている場合:) )
List.Contains と List.IndexOf はハッシュ コードを使用せず、.Equals メソッドを使用するため、内部のハッシュ コードをチェックすることを提案しました。おそらく目立たないでしょうが、実行のすべてのミリ秒を取得するためにうずうずしている場合(常に良いことではありません、バグねえ! :P )これは誰かを助けるかもしれません. ただ言って... :)