Birisi LINQ işlevlerinin Where (..) ve FindAll (..) farklı olduğunu açıklayabilir mi? İkisi de aynı şeyi yapıyor gibi görünüyor ...
Birisi LINQ işlevlerinin Where (..) ve FindAll (..) farklı olduğunu açıklayabilir mi? İkisi de aynı şeyi yapıyor gibi görünüyor ...
Yanıtlar:
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 FindAll
yalnı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 Where
bir örneğini döndürür IEnumerable
. istenen öğeleri içeren FindAll
yeni bir döndürür List<T>
. FindAll
daha çok Where(...).ToList()
bir örneğini çağırmak gibidir IEnumerable
.
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.
80 bin nesneden oluşan bir liste üzerinde bazı testler yaptım ve bunun Find()
bir Where
ile 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ı.