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*/ }
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?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.
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
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();
Nasıl'un geri dönüşüm mekanizması...
Nasıl düzeltmeyi kullanmak, ve nasıl ç...
JavaScript kilitler nasıl çalışır?...
CSS üçgenler nasıl çalışır?...
Veri bağlama Nasıl çalışır?AngularJS :...