2012-03-01 19 views
5

Verim anahtar kelimesini daha iyi anlamaya çalışıyorum ve bunun hakkında yeterince iyi bir anlayışa sahip olduğumu düşünüyorum, bu yüzden bazı testler yaptım, ancak sonuçlardan dolayı çok şaşırdım.Verim anahtar kelimesini anlamak ve LINQ

ben değil sadece sayıya kadar tümü üzerindeki döngüler gösteriyor ki şu çıktıyı almak için aşağıdaki kodu çalıştırırsanız 4.

public void DoIt() 
    { 
     Console.WriteLine("Method Call"); 
     var results = GetData(Enumerable.Range(1, 10)); 
     Console.WriteLine("LINQ"); 
     var filtered = results.Where(x => x == 4); 
     Console.WriteLine("Start result loop"); 
     foreach (var item in filtered) 
     { 
       Console.WriteLine("Item is " + item); 
     } 
    } 

    private IEnumerable<int> GetData(IEnumerable<int> Input) 
    { 
     foreach (int item in Input) 
     { 
      if (item % 2 == 0) 
      { 
       Console.WriteLine("Found " + item); 
       yield return item; 
      } 
     } 
    } 

Çıktı:

Method Call 
LINQ 
Start result loop 
Found 2 
Found 4 
Item is 4 
Found 6 
Found 8 
Found 10 

ise Aşağıdaki kodu çalıştırıyorum, sadece 4'e ulaştığını ve sonra durduğunu gösterir.

public void DoIt() 
    { 
     Console.WriteLine("Method Call"); 
     var results = GetData(Enumerable.Range(1, 10)); 
     Console.WriteLine("Start result loop"); 
     foreach (var item in results) 
     { 
      if (item == 4) 
      { 
       Console.WriteLine("Item is " + item); 
       break; 
      } 
     } 
    } 

    private IEnumerable<int> GetData(IEnumerable<int> Input) 
    { 
     foreach (int item in Input) 
     { 
      if (item % 2 == 0) 
      { 
       Console.WriteLine("Found " + item); 
       yield return item; 
      } 
     } 
    } 

Çıktı: Ben bir şey anlaşılmasına değilim ama LINQ bunu yapmasını istediğiniz şeyi tam tersini yapıyor gibi gözükür tahmin

Method Call 
Start result loop 
Found 2 
Found 4 
Item is 4 

? LINQ verim ve ertelenmiş yürütmeyi de kullansa da, ikinci kod kümesindeki sonuçların ilk kod kümesi için aynı olmasını beklerdim.

+0

'Burada sonuçlar filtrelenir, Bir öğe, yüklemi karşıladığında sonuçları döndürmeyi bırakmaz. Öte yandan, "foreach" elkitabı, yüklenen kişi memnun olduğunda ... –

cevap

12

Ertelenmiş yürütmeyi kullanır. LINQ Where, girişin tüm elemanlarını sayısız olarak kontrol eder, bulunan ilk elemana geldiğinde durmaz. First'un yaptığı şey budur.

İlk örneğiniz, Where değerini First olarak değiştirdiyseniz veya ikinci örnekte break kaldırdıysanız, ikinci örnekle aynı olur.

2

Sanırım temel mantığınızı yanlış yaptınız, LINQ değil. İlk örneğiniz tüm aralık boyunca yinelemek zorundadır, çünkü buradaki koşul 4'e eşit olan tüm değerleri bulmak zorundadır, sadece ilk değer değil, 4'e eşittir.