2015-11-18 33 views
1

我有以下方法:訪問實例字段INF的foreach刪除實例

private void ResolveRiver(IEnumerable<Barge> riverBarges) 
{ 
    Barge currentBarge = riverBarges.FirstOrDefault(); 
    if (currentBarge == null) return; 
    var groupedBarges = riverBarges.Where(b => currentBarge.MileMarker + 0.5d >= b.MileMarker && !b.IsGrouped); 
    BargeGroup group = new BargeGroup { Barges = groupedBarges }; 
    m_bargeGroups.Add(group); 
    foreach (Barge barge in group.Barges) 
    { 
     barge.IsGrouped = true; 
    } 
    IEnumerable<Barge> otherBarges = riverBarges.Except(groupedBarges); 
    //ResolveRiver(otherBarges); 
} 

riverBarges是升序sortered IEnumerable。在foreach循環group.Barges爲空之後,我真的很想知道爲什麼會發生這種情況?

回答

2

那是因爲group.BargesIEnumerable<T>(它實際上是一個WhereEnumerableIterator),這是每次調用它時執行。迭代器會一次產生一個值,但不會存儲投影值。你應該做的是首先物化查詢,然後循環存儲List<T>T[]

var groupedBarges = riverBarges.Where(b => currentBarge.MileMarker + 0.5d >= b.MileMarker 
              && !b.IsGrouped) 
           .ToList(); 

BargeGroup group = new BargeGroup { Barges = groupedBarges }; 
m_bargeGroups.Add(group); 
foreach (Barge barge in group.Barges) 
{ 
    barge.IsGrouped = true; 
}