Linq kullanarak bir nesne listesinde değerin olup olmadığını arama


228

Diyelim ki Customerbir özelliği olan bir sınıfım var FirstName. Sonra bir tane var List<Customer>.

Listenin bir müşterisi olup olmadığını Firstname = 'John'tek bir ifadede bulmak için LINQ kullanılabilir .. nasıl?

Yanıtlar:


459

LINQ, bu tam sorunu çözmek için mükemmel bir uzantı yöntemi tanımlar:

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

LINQ burada yaşıyor, System.Core.dll başvurduğunuzdan emin olun.


24
Herhangi biri iyi, merak ediyorum kaç geliştirici Sayısı kullanmaları gerekir ne zaman kullanmalısınız?
RichardOD

12
Ayrıca büyük / küçük harfe duyarlı olmayan bir arama da yapabilirsiniz: cus => cus.FirstName.Equals ("John", StringComparison.CurrentCultureIgnoreCase)
jmservera

1
Bunun eski bir soru olduğunu biliyorum ama neden Exists yöntemini kullanmıyoruz? Bir şeylerin var olup olmadığını görmek için yapılmış gibi görmek.
Blackunknown

6
Çünkü tüm koleksiyonlarda Mevcut değil ve lambda ifadesi değil, aradığımız nesne.
zvolkov

1
@zvolkov, Yeniden paylaşımımın bool kullanmamı önerdiğine dair herhangi bir fikir = list.All (cus => cus.FirstName! = "John"); Bu daha uygun mu?
Güllü

105

zvolkov'un cevabı , böyle bir müşteri olup olmadığını öğrenmek için mükemmeldir . Daha sonra müşteriyi kullanmanız gerekiyorsa şunları yapabilirsiniz:

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

Bu senin sorduğun şey değil biliyorum, ama bir takip sorusunu önceden boşaltıp durduğumu sanıyordum :) (Tabii ki, bu sadece ilk müşteriyi bulur ... hepsini bulmak için, sadece bir normal wherefıkra.)


7
Hata ayıklama söz konusu olduğunda bunu daha sonra yapmayı takdir edebileceğinizi belirtmek isterim, eğer kendinizi hangi müşterinin kriterlere uyduğunu aniden merak ederseniz.
mqp

1
Sadece bu cevabı bire çarpıyorum, çünkü SO topluluğunun soruya / cevaba daha da fazla eklemek için ekstra adım atıyor.
barneymc

1
teşekkürler bana yardımcı oldu, ama bazen sadece boolsonuç almak istiyorum , bu durumda .Anyya .FindIndexda burada hızlı olan kullanılır ?
shaijut

1
@stom: İkisi de O (N), temelde ... sadece doğrusal aramalar.
Jon Skeet

bu kadar çarpıyor. Bir liste yapmak yerine list.FirstOrDefault sözdizimini nasıl kullandığınızı seviyorum.
GunWanderer

25

Söz konusu takip için bir seçenek (herhangi bir sayıda ilk adı olabilecek bir müşteri nasıl bulunur):

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

veya müşteriyi benzer listenin CSV'sinden almak için

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

10

Linq'i kullanmak için birçok olasılık var, burada lambda kullanmadan:

//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")

Bu, böyle bir giriş varsa "eğer" sorusuna cevap vermez; yalnızca değerleri varsa numaralandırır. Bu numaralandırmanın boş olup olmadığını belirlemek için fazladan bir adım gereklidir.
Jason

Ardından Where'i Any olarak değiştirin. Muhtemelen benim için daha felsefi. Hangilerinin umursamadan olup olmadığını nadiren bilmek istiyorum. @jmservera: haklıydın. Bir süre önce LINQ'dan vazgeçtim ve şimdi Lambda'yı sadece kullanıyorum.
Chris Brandsma

Lambda çağrılarını kullanmanın teknik olarak LINQ kullandığını söylediğimde bilgiçlik yapmayı istemiyorum. (Özellikle, LINQ-to-Objects kullanıyorsunuz.) Yalnızca dil anahtar sözcükleri yerine yöntem çağrılarını kullanıyorsunuz.
Judah Gabriel Himango

Bu cevap zvolkov'lardan nasıl farklı?
dotnetN00b

4

Keşfetmeden önce kullandığım teknik .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" adında bir müşteri yoksa john null olur.


2
Birden fazla müşteri John olarak adlandırılırsa bu bir istisna oluşturur .
Jon Skeet

1
Yorum için teşekkürler. Cevabı kısmen doğru bir örnek olarak bırakacağım.
M4N

Bir senaryoda, 1 olduğundan emin olduğunuzda ve birden fazla varsa bir istisnanın yükseltilmesini istediğinizde hala geçerlidir, bu yüzden silmemenizin iyi olduğunu düşünüyorum.
RichardOD

1

Bir başka olasılık

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

4
Bu senaryoda Herhangi birini kullanmak tercih edilir.
RichardOD

1

Bunu deneyin, umarım size yardımcı olur.

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

4
Bu, 8 yıl önce kabul edilen cevapla aynı. Lütfen yanıtınızın tüm yanıtlar arasında benzersiz olduğundan emin olun.
Tony_Henrich
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.