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.