Linqを使用してオブジェクトのリストに値が存在するかどうかを検索する


228

Customerプロパティを持つクラスがあるとしますFirstName。それから私は持っていList<Customer>ます。

LINQを使用して、リストFirstname = 'John'に1つのステートメントで顧客が含まれているかどうかを確認できますか?どのように?

回答:


459

LINQは、この正確な問題を解決するのに最適な拡張メソッドを定義します。

using System.Linq;
...
    bool has = list.Any(cus => cus.FirstName == "John");

LINQが存在するSystem.Core.dllを参照してください。


24
Anyは良いですが、Anyを使用する必要があるときに、Countを使用する開発者は何人いるのでしょうか。
RichardOD 2009

12
大文字と小文字を区別しない検索を行うこともできます。cus => cus.FirstName.Equals( "John"、StringComparison.CurrentCultureIgnoreCase)
jmservera

1
これは古い質問ですが、なぜExistsメソッドを利用しないのですか?物事が存在するかどうかを確認するために作られているのを見る。
Blackunknown 14

6
すべてのコレクションにExistsがあるわけではなく、ラムダ式ではなく、目的のオブジェクト自体が必要なためです。
zvolkov 14

1
@zvolkov、リシャーパーがboolを使用することを提案している理由は、次のとおりです。= list.All(cus => cus.FirstName!= "John"); これはより最適ですか?
Gullu 2018

105

zvolkovの答えは、そのような顧客がいるかどうかを調べるのに最適です。後で顧客を使用する必要がある場合は、次のことができます。

Customer customer = list.FirstOrDefault(cus => cus.FirstName == "John");
if (customer != null)
{
    // Use customer
}

これはあなたが求めていたものではないことはわかっていますが、私は後続の質問を回避したいと思っていました:)(もちろん、これは最初のそのような顧客のみを見つけます...通常のwhere条項。)


7
基準に合った顧客が突然気になった場合は、デバッグに関しては後でこれを行っていただければ幸いです。
mqp 2009

1
この回答を1つのcosに上げるだけで、SOコミュニティが質問/回答にさらに追加する追加の手順を実行する方法が気に入っています。
barneymc 2014年

1
おかげで私を助けましたが、時々私はbool結果を得たいだけなので、その場合、.Anyまたはここ.FindIndex使用され ますか?
shaijut 2016年

1
@stom:基本的にはどちらもO(N)です...線形検索です。
Jon Skeet 2016年

これを上げる。list.Where()。FirstOrDefaultではなく、list.FirstOrDefaultの構文を使用する方法が好きです。
GunWanderer 2017

25

フォローアップ質問の1つのオプション(名をいくつでも持つ可能性のある顧客を見つける方法):

List<string> names = new List<string>{ "John", "Max", "Pete" };
bool has = customers.Any(cus => names.Contains(cus.FirstName));

または同様のリストのcsvから顧客を取得する

string input = "John,Max,Pete";
List<string> names = input.Split(',').ToList();
customer = customers.FirstOrDefault(cus => names.Contains(cus.FirstName));

10

Linqを使用すると、多くの可能性があります。ここでは、ラムダを使用しない場合を考えます。

//assuming list is a List<Customer> or something queryable...
var hasJohn = (from customer in list
         where customer.FirstName == "John"
         select customer).Any();

5
customerList.Any(x=>x.Firstname == "John")

これは、そのようなエントリが存在する場合の質問の答えにはなりません。存在する場合は、単に値を列挙するだけです。この列挙が空でないかどうかを判断するには、追加の手順が必要です。
ジェイソン

次に、WhereをAnyに変更します。おそらく私にとってはより哲学的です。私は彼らがどれであるかを気にすることなしに知る必要はほとんどありません。@jmservera:あなたは正しかった。私はしばらく前にLINQをあきらめ、現在はLambdaのみを使用しています。
Chris Brandsma

ラムダコールを使用することは、技術的にはLINQを使用していると私が言っているとき、私は平凡であるという意味ではありません。(特に、LINQ-to-Objectsを使用しています。)言語キーワードではなく、メソッド呼び出しを使用しています。
ユダガブリエルヒマンゴ2009

この回答はzvolkovの回答とどのように異なりますか?
dotnetN00b 2012年

4

発見する前に使用したテクニック.Any()

var hasJohn = (from customer in list
      where customer.FirstName == "John"
      select customer).FirstOrDefault() != null;

3
List<Customer> list = ...;
Customer john = list.SingleOrDefault(customer => customer.Firstname == "John");

「John」の名を持つ顧客が存在しない場合、johnはnullになります。


2
複数の顧客がJohnと呼ばれる場合、例外がスローされます。
Jon Skeet、

1
コメントをありがとう。答えは部分的に正しい例として残しておきます。
M4N 2009

それが1であることが確実で、複数の場合に例外を発生させたい場合でも、シナリオでは有効です。そのため、削除しなかったのは良いことだと思います。
RichardOD 2009

1

別の可能性

if (list.Count(customer => customer.Firstname == "John") > 0) {
 //bla
}

4
このシナリオではAnyを使用することをお勧めします。
RichardOD 2009

1

これを試してみてください。

 if (lstCustumers.Any(cus => cus.Firstname == "John"))
 {
     //TODO CODE
 }

4
それは8年以上前から受け入れられた答えと同じです。回答がすべての回答の中で一意であることを確認してください。
Tony_Henrich
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.