2016-04-08 15 views
1

Benim foreach döngüsünü tüm koleksiyon üzerinde yineleme değil, sadece ilk öğe ve nedenini anlayamıyorum. Bulduğum tek benzer soru şuydu: IEnumerable not enumerating in foreachForeach döngüsü tüm IEnumerable üzerinde yinelenmez

Ancak tek cevap, soru yazarı tarafından yayınlandı ve IEnumerable hakkında gerçekten anlamlı olmayan bir zaman aşımıyla ilgili konuştu ve daha önce hiç duymadım .

IEnumerable<Document> documentsToAdd = dbEvent.Documents.Where(
    dbd => !eventToSave.Documents.Select(d => d.DocumentId) 
    .Contains(dbd.DocumentId)); 
foreach (Document documentToAdd in documentsToAdd) { 
    documentToAdd.DocumentType = null; 
    documentToAdd.DeletedByUser = null; 
    documentToAdd.DocumentOwnerTeam = null; 
    documentToAdd.UploadedByUser = null; 
    documentToAdd.UploadedInStage = null; 
    hcDbContext.Documents.Add(documentToAdd); 
} 

ayıklayıcıya ben documentsToAdd koleksiyonunda 3 unsurlar içerdiğini görebiliriz. Ama döngüden geçtiğimde, sadece bir kez geçer ve sonra devam eder, böylece sadece ilk belge kaydedilir. documentsToAdd içeriğini doğruladığımdan, sorunun Where maddesinde olmadığını biliyorum. Koleksiyonun tamamı neden foreach'a girmiyor?

DÜZENLEME

Açık olmak gerekirse, hiçbir istisnası atılır. Döngüden bir kez geçiyor ve foreach'dan sonra bir sonraki satıra geçiyor.

+2

Bir istisna alıyorsunuz arayarak size, foreach başlamadan önce tüm sonuçların emin? Kod bir deneme yan tümce. – jdweng

+0

İstisna yok. Sadece bir kez döngüden geçer ve foreach sonrasında bir sonraki hatta geçer. – Legion

+1

Nasıl biliyorsunuz ** numaralandırmada birden fazla kalem var mı? – CodingGorilla

cevap

2

IEnumerable bir yineleyicidir, bu nedenle her seferinde bir sonuç döndürür.

Her zaman foreach döngülerinde, sonraki sonuç için yineleyiciden sorar. Bazen sonuçlar, numaralandırılan koleksiyondan silinebilir, dolayısıyla beklenmedik davranışlar elde edersiniz. Bunu önlemek için

yapmak .ToList()

// Make a list of all documents 
    List<Document> documentsToAdd; 

    documentsToAdd = dbEvent.Documents 
          .Where(dbd => !eventToSave.Documents 
                .Select(d => d.DocumentId) 
                .Contains(dbd.DocumentId)) 
          .ToList(); // load all results 

    // Now this will loop through the whole list 
    foreach (Document documentToAdd in documentsToAdd) 
    { 
     documentToAdd.DocumentType = null; 
     documentToAdd.DeletedByUser = null; 
     documentToAdd.DocumentOwnerTeam = null; 
     documentToAdd.UploadedByUser = null; 
     documentToAdd.UploadedInStage = null; 

     hcDbContext.Documents.Add(documentToAdd); 
    } 
+0

Bunun neden çalıştığını açıklayabilir misiniz? Chris'e sorduğum gibi, neden bir IEnumerable'ı güvenilir bir şekilde numaralandıramıyorsun? Güvenilir bir şekilde söylüyorum çünkü son birkaç gündür çalışıyor ve sadece bugün bunu yapmaya başladı. ToList() dönüşümü neden gereklidir? – Legion

+0

@Legion, ToList() öğesini kaldırmaya çalışın, yürütmeyi bir hata ayıklayıcıyla başlatın, foreach döngüsünün sonuna kadar izleyin ve sonra numaralandırın numaralandırın. – enkryptor

İlgili konular