List<T>
のContains
とExists
の違いを知りたいですか?
どちらも、要素がList<T>
にあるかどうかを判断できます。
しかし、それらの間の違いは何ですか?
// Create a list of parts.
List<Part> parts = new List<Part>();
// Add parts to the list.
parts.Add(new Part() { PartName = "crank arm", PartId = 1234 });
parts.Add(new Part() { PartName = "chain ring", PartId = 1334 });
parts.Add(new Part() { PartName = "regular seat", PartId = 1434 });
parts.Add(new Part() { PartName = "banana seat", PartId = 1444 });
parts.Add(new Part() { PartName = "cassette", PartId = 1534 });
parts.Add(new Part() { PartName = "shift lever", PartId = 1634 }); ;
// of the Part class, which checks the PartId for equality.
Console.WriteLine("\nContains: Part with Id=1444: {0}",
parts.Contains(new Part { PartId = 1444, PartName = "" }));
// Check if an item with Id 1444 exists.
Console.WriteLine("\nExists: Part with Id=1444: {0}",
parts.Exists(x => x.PartId == 1444));
// result
// Contains: Part with Id=1444: True
// Exists: Part with Id=1444: True
ExistsとContainメソッドは似ていますが、目的が異なります。
Exists:指定された述語によって定義された条件に一致する要素がリストに含まれているかどうかを判別します。
含む:要素がリストにあるかどうかを判別します
List<T>.Exists()
は、リスト内の項目のいずれかが条件(述語として指定)を満たしているかどうかを確認します。 「述語」は、テスト対象のアイテムを受け入れ、true(一致)またはfalseを返す単なるメソッドです。
あなたが投稿したコードは、 List<T>.Exists
MSDNページのサンプルコードと非常によく似ているようです。これは、 Contains
を使用することの複雑さを非常に明確に示しています。単純なメンバーシップテスト以外。そのページのコードを調べると、PartIdで検索できるようにIComparable<T>
インターフェイスが実装されていることがわかります。つまり、他のコードで検索することはできません。良いことは、doがList
に特定のオブジェクトインスタンスが含まれているかどうかを確認したいだけで、そのオブジェクトのタイプには含まれていないことです。 IComparable<T>
を実装すると、かなり迅速に実装できます。
一方、List<T>.Exists
を使用すると、そのオブジェクトを比較するための特定のルールセットにプログラムをロックすることなく、単純または複雑な任意の評価を指定できます。
Spider_Says_hiが別の回答で述べたように、Contains
もLINQに存在し、同様に動作しますが、すべてのLINQバリアント(LINQからSQL、LINQからエンティティなど)で同じように動作することが保証されないことは明らかです。 。 List<T>.Exists
の同等のLINQメソッドは IEnumerable<T>.Any
です。
存在は任意の機能を使用できます。含むは、要素タイプの.Equals
の実装に依存し、リスト内のオブジェクトと比較するために新しいPartオブジェクトを作成する必要があることに注意してください。
あなたの例では、Existsメソッドで、比較のための条件を定義しています。 containsメソッドでは、Equalsメソッドを上書きしない限り、デフォルトのEqualityComparerに基づいて決定されます。したがって、比較に何を使用しているかを知る必要があります。