SORU
2 EYLÜL 2010, PERŞEMBE


Kullanmak Ne? ıenumerable vs Liste - Nasıl çalışır?

Sıralayıcısını nasıl çalışmaları üzerine bazı şüphelerim var, ve SERİ. Seçer: bu iki basit düşünün

List<Animal> sel = (from animal in Animals 
                    join race in Species
                    on animal.SpeciesKey equals race.SpeciesKey
                    select animal).Distinct().ToList();

ya

IEnumerable<Animal> sel = (from animal in Animals 
                           join race in Species
                           on animal.SpeciesKey equals race.SpeciesKey
                           select animal).Distinct();

Bu daha genel bir örnek gibi görünüyor ki benim orijinal nesnelerin adlarını değiştirdim. Önemli olan kendisi değil sorgu. Sormak istediğim şudur:

foreach (Animal animal in sel) { /*do stuff*/ }
  1. Fark ettim ki eğer ben kullanmak IEnumerable, ben hata ayıklama ve kontrol "sel", bu durumda, IEnumerable, bazı ilginç üyeleri: "iç", "dış", "innerKeySelector" ve "outerKeySelector", bu son 2 görünüyor delegeler. "Üye", bu durumda, ancak "Türlerin" benim için çok garip olan örnekleri. daha doğrusu Hayvan yok "iç "Üye" Hayvan "örneği. içeren" dış İki delege giren ve ne çıkarsa belirleyen sanırım?

  2. Eğer kullanırsam bu "Farklı", "iç" "dış" doğru değerler içeriyor. 6 öğeler (bu 2 Ayrı tek bir yanlış), ama içerir fark ettim Yine muhtemelen temsilci yöntemleri belirlemek ama bu IEnumerable biliyorum biraz daha fazla.

  3. En önemlisi, iki seçenek iyi performans açısından?

.ToList() üzerinden kötü Liste bu dönüşüm?

Ya da belki de doğrudan numaralandırıcısı kullanarak?

Eğer siz de bir açıklama ya da IEnumerable bu açıklar bazı bağlantılar atmak.

CEVAP
2 EYLÜL 2010, PERŞEMBE


Ienumerable Listesi Bu davranış, uygulama sırasında davranışını açıklar. IEnumerable kullandığınızda, derleyici sonrasına kadar iş, muhtemelen yol boyunca optimize ertelemek için bir şans verin. Eğer ToList() derleyici sonuçları hemen reify için zorlama.

""SERİ ifadeler, IEnumerable kullanıyorum, çünkü sadece SERİ veriyorum davranış belirtme değerlendirme erteleme ve muhtemelen programı optimize etmek için bir şans. üst üste yığıyorum zaman Hatırlıyorum ETMENİZ sizin numaralandırma kadar veritabanı sorgu için SQL oluşturmak değil mi? Bu göz önünde bulundurun:

public IEnumerable<Animals> AllSpotted()
{
    return from a in Zoo.Animals
           where a.coat.HasSpots == true
           select a;
}

public IEnumerable<Animals> Feline(IEnumerable<Animals> sample)
{
    return from a in sample
           where a.race.Family == "Felidae"
           select a;
}

public IEnumerable<Animals> Canine(IEnumerable<Animals> sample)
{
    return from a in sample
           where a.race.Family == "Canidae"
           select a;
}

Şimdi ilk örnek seçtiği bir yöntem ("") AllSpotted, artı bazı filtreler. Şimdi bunu yapabilirsiniz:

var Leopards = Feline(AllSpotted());
var Hyenas = Canine(AllSpotted());

Yani IEnumerable Listesi üzerinde kullanmak için daha hızlı? Eğer birden fazla kez yürütülen bir sorgu önlemek istiyorsanız. Ama genel olarak daha iyi? Yukarıda iyi, Leoparlar ve Sırtlanlar dönüşüyortek her SQL sorguveritabanına yalnızca ilgili satır döndürür. Ama eğer biz geri dönmüştü Listesinden AllSpotted(), o zaman olabilir daha yavaş çünkü veritabanı olabilir geri dönüş çok daha fazla veri daha gerçekten gerekli ve biz atık devir yapıyor filtreleme istemci.

Bir program olabilir daha iyi için erteleme dönüştürme sorgusu için bir liste kadar çok sonda, eğer öyleyse ben gidiyorum numaralandırma ile Leopar ve Sırtlanlar daha sonra, yapacağım bu

List<Animals> Leopards = Feline(AllSpotted()).ToList();
List<Animals> Hyenas = Canine(AllSpotted()).ToList();

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Dan Gately

    Dan Gately

    13 AĞUSTOS 2006
  • kamaniusilelis

    kamaniusilel

    10 HAZİRAN 2011
  • UsherVEVO

    UsherVEVO

    15 EKİM 2009