web-dev-qa-db-ja.com

List <T>のContainsとExistsの違いは何ですか?

List<T>ContainsExistsの違いを知りたいですか?

どちらも、要素が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 
10
Vic

ExistsContainメソッドは似ていますが、目的が異なります。

Exists:指定された述語によって定義された条件に一致する要素がリストに含まれているかどうかを判別します。

含む:要素がリストにあるかどうかを判別します

List<T>.Exists()は、リスト内の項目のいずれかが条件(述語として指定)を満たしているかどうかを確認します。 「述語」は、テスト対象のアイテムを受け入れ、true(一致)またはfalseを返す単なるメソッドです。

11
Shweta Pathak
  1. ExistsはListのメソッドであり、配列またはIEnumerable拡張機能にはそのようなメソッドはありません。

  2. このメソッドの正しい使用法の構文はx => s.Exists(y => y == x.id)です(述語、つまりブール値を返すメソッドを渡す必要があります)

  3. 違いは-ContainsはLinqto Entitiesでサポートされていますが、Existsはサポートされていません。

ここ からコードを取得したようですはい?このスレッドをチェックしてください ここ 同様の質問をします。それが役に立てば幸い!

4
Vandal

あなたが投稿したコードは、 List<T>.Exists MSDNページのサンプルコードと非常によく似ているようです。これは、 Contains を使用することの複雑さを非常に明確に示しています。単純なメンバーシップテスト以外。そのページのコードを調べると、PartIdで検索できるようにIComparable<T>インターフェイスが実装されていることがわかります。つまり、他のコードで検索することはできません。良いことは、doListに特定のオブジェクトインスタンスが含まれているかどうかを確認したいだけで、そのオブジェクトのタイプには含まれていないことです。 IComparable<T>を実装すると、かなり迅速に実装できます。

一方、List<T>.Existsを使用すると、そのオブジェクトを比較するための特定のルールセットにプログラムをロックすることなく、単純または複雑な任意の評価を指定できます。

Spider_Says_hiが別の回答で述べたように、ContainsもLINQに存在し、同様に動作しますが、すべてのLINQバリアント(LINQからSQL、LINQからエンティティなど)で同じように動作することが保証されないことは明らかです。 。 List<T>.Existsの同等のLINQメソッドは IEnumerable<T>.Any です。

2
Corey

存在は任意の機能を使用できます。含むは、要素タイプの.Equalsの実装に依存し、リスト内のオブジェクトと比較するために新しいPartオブジェクトを作成する必要があることに注意してください。

1
Random832

あなたの例では、Existsメソッドで、比較のための条件を定義しています。 containsメソッドでは、Equalsメソッドを上書きしない限り、デフォルトのEqualityComparerに基づいて決定されます。したがって、比較に何を使用しているかを知る必要があります。

0