Bir koleksiyonun en son N öğeleri kullanarak Etmeniz?
Koleksiyonu verildiğinde, bu koleksiyonun son N öğeleri almak için bir yolu var mı? Eğer bu çerçevede bir yöntem değil varsa, bunu yapmak için bir uzantısı yöntemi yazmak için en iyi yolu ne olurdu?
CEVAP
collection.Skip(Math.Max(0, collection.Count() - N));
Bu yaklaşım, herhangi bir sıralama bağımlı olmadan öğe düzenini korur, ve birkaç SERİ sağlayıcıları arasında geniş uyumluluk vardır.
Önemli bakım negatif bir sayı ile Skip
aramak için değil. Bazı sağlayıcılar, Varlık Çerçevesi gibi, negatif bir argüman sunulduğunda bir ArgumentException üretecek. 4 ** çağrısı bu özenle kaçınır.
Hangi uzatma yöntemleri için gerekli olan aşağıda sınıfı: statik bir sınıf statik bir yöntem, ve this
anahtar kullanın.
public static class MiscExtensions
{
// Ex: collection.TakeLast(5);
public static IEnumerable<T> TakeLast<T>(this IEnumerable<T> source, int N)
{
return source.Skip(Math.Max(0, source.Count() - N));
}
}
Performans ile ilgili kısa bir not:
Count()
çağrı bazı veri yapıları sayımı neden olabilir, çünkü, bu yaklaşım, veriler üzerinde iki geçiş neden olma riski vardır. Bu gerçekten en enumerables ile ilgili bir sorun değil; aslında, en iyi duruma getirme zaten Listeler, Diziler ve EF sorguları için bile O(1) Count()
ameliyat zamanı değerlendirmek için var.
Ancak, salt ileri bir sayısız kullanın ve iki geçiş yapılmasını önlemek için istiyorsunuz gerekiyorsa, Lasse V. Karlsen Mark Byers gibi one-pass algoritması bir tarif düşünün. Bu yaklaşımların her ikisi de koleksiyonun sonuna bulunduğunda elde olan numaralandırma süre öğeleri saklamak için geçici bir tampon kullanın.
Nasıl bir liste ETMENİZ kullanarak yin...
SERİ bir listeden öğeleri kaldırmak iç...
Nasıl liste öğeleri CSS kullanarak sat...
Bir liste Lambda/kullanarak sıralama E...
Liste etmeniz kullanarak Kaldır çoğalt...