SORU
10 AĞUSTOS 2010, Salı


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
10 AĞUSTOS 2010, Salı


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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Eric Anthony

    Eric Anthony

    13 AĞUSTOS 2011
  • Kenneth Håkonsen

    Kenneth Håk

    13 Mart 2011
  • LearnCode.academy

    LearnCode.ac

    20 Aralık 2012