LINQ, Where () vs FindAll ()


Yanıtlar:


203

FindAll()List<T>tür üzerinde bir işlevdir , gibi bir LINQ genişletme yöntemi değildir Where. LINQ genişletme yöntemleri, uygulayan herhangi bir tür üzerinde çalışır IEnumerable, ancak FindAllyalnızca List<T>örneklerde (veya elbette ondan devralan sınıfların örneklerinde) kullanılabilir.

Ek olarak, gerçek amaç bakımından farklılık gösterirler. nesne numaralandırıldığında isteğe bağlı olarak yürütülen Wherebir örneğini döndürür IEnumerable. istenen öğeleri içeren FindAllyeni bir döndürür List<T>. FindAlldaha çok Where(...).ToList()bir örneğini çağırmak gibidir IEnumerable.


20
Evet,
findall'ın

2
code.msdn.microsoft.com/LINQ-Query-Execution-ce0d3b95 tembel (ertelenmiş) ve anında yürütme arasındaki farkları açıklar. Temel olarak, bazı durumlarda, tüm listeye ihtiyacınız yoktur, bir şey olana kadar öğeler arasında dolaşıp sonra durmak isteyebilirsiniz. Tembelin işe yaradığı yer burasıdır, ancak uygulamaya bağlı olarak öngörülemeyen sonuçlara yol açabilir (tümü bağlantıda açıklanmıştır). Bu yardımcı olur umarım.
nurchi

10

Benim için en büyük fark, .FindAll'ın .Net 2.0'da da mevcut olmasıdır. Her zaman .Net 3.5'te programlama lüksüne sahip değilim, bu yüzden .Net jenerik koleksiyonlarının 'yerel' yöntemlerini hatırlamaya çalışıyorum.

LINQ yapamadığım için zaten mevcut bir List yöntemini kendim uyguladığım birkaç kez oldu.

Ne bu durumda kullanışlı bulduğu, VS2008 kullanarak, I edebilir tip çıkarımlar ve lambda sözdizimini kullanın. Bunlar derleyici özellikleridir, çerçeve özellikleri değildir. Bu, bunu yazabileceğim ve hala .Net 2.0 içinde kalabileceğim anlamına geliyor:

var myOddNums = myNums.FindAll(n => n%2==1);

Ancak LINQ'niz varsa, ertelenmiş yürütme ile anında yürütme arasındaki farkı korumak önemlidir.


6

Doğru hatırlıyorsam, temel fark (uygulandıklarının yanı sıra: IEnumerable<T>vs. List<T>), Whereertelenmiş yürütmeyi gerçekleştirmesidir, burada gerçekten ihtiyacınız olana kadar arama yapmaz - örneğin bunu bir foreach döngüsünde kullanarak. FindAllacil bir yürütme yöntemidir.


3

80 bin nesneden oluşan bir liste üzerinde bazı testler yaptım ve bunun Find()bir Whereile kullanmaktan% 1000 daha hızlı olabileceğini gördüm FirstOrDefault(). Her aramadan önce ve sonra bir zamanlayıcıyı test edene kadar bunu bilmiyordum. Bazen aynıydı, bazen daha hızlıydı.


5
Koleksiyona da erişmeyi denediniz mi? Enumerable.Where () ertelenmiş yürütmeyi kullanır ve koleksiyona erişilmeden önce değerlendirilmez, bu da gerçekten daha hızlı olup olmadığı konusunda yanlış fikirlere yol açabilir. Yine de, çoğunlukla statik koleksiyonlar yerine numaralandırılabilirleri kullanmak daha hızlıdır (Type <T> ve Array <T> gibi).
Sebastian Job Bjørnager Jensen

Soru FindAll ile ilgili. Açıkça Bul, Nereden daha hızlı olacak (tüm değerleri alıyor) ve FirstOrDefault'u alıyor
Vivek MVK
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.