2011-03-11 12 views
0

ちょっと人々 昨日、私はいくつかのコードで作業していましたが、foreachの繰り返しを保存し、リスト<>働く後で私は、lamdaを使ってforeachを使うようにコードをリファクタリングしました。ここでstatementと私の項目evrytimeが見つかりました。作業バージョン技術的な理由:この繰り返しは私のアイテムを見つけられないのです

private XmlCell FindCell(string id) 
    { 
     XmlSection section = new XmlSection(SectionNode); 
     XmlCell currentCell = null; 

     foreach (XmlBlock block in section.Blocks) 
     { 
      foreach (XmlRow row in block.Rows) 
      { 
       currentCell = row.Cells.Find(cell => string.Equals(cell.Id, id)); 
      } 
     } 

     Assert.IsNotNull(currentCell, string.Format("Cell with id {0} not found", id)); 
     return currentCell; 
    } 

::バージョンを動作していない

:コードの

私の2つのバージョンが下に掲載されている

XmlSection section = new XmlSection(SectionNode); 
XmlCell currentCell = null; 

foreach (XmlBlock block in section.Blocks) 
{ 
    foreach (XmlRow row in block.Rows) 
    { 
     foreach (XmlCell cell in row.Cells.Where(cell => string.Equals(cell.Id, id))) 
     { 
      return cell; 
     } 
    } 
} 

Assert.IsNotNull(currentCell, string.Format("Cell with id {0} not found", id)); 
return currentCell; 

コードの最初のビットが取得いけない理由誰かがPLX説明できますジョブが完了したら、findメソッドはリスト内で最初に見つかったインスタンスを返します。

「コレクションが変更されたため、列挙操作が実行できない可能性があります」というエラーが発生しました。なぜですか?

答えて

2

Findが一致するIDを持つセルを見つけられなかった場合、次の反復で変数currentCellが再びnullになるためです。 2番目のコードでは、見つかったセルをすぐに返します。コードの最初の部分で

これを試してみてください。

foreach (XmlRow row in block.Rows) 
{ 
currentCell = row.Cells.Find(cell => string.Equals(cell.Id, id)); 
//new 
if (currentCell != null) 
    return currentCell; 
//end new 
} 
1

あなたが指定したIDを使用してセルを見つけた場合、currentCellがこの特定のオブジェクトに設定されています。二つ目は、すぐにそれを見つけると、すべてのネストされたループから復帰 - Findリターンコードの2つのバージョンが異なっている:)

foreach (XmlRow row in block.Rows) 
    { 
    currentCell = row.Cells.Find(cell => string.Equals(cell.Id, id)); 
    } 
0

何しかし、foreachループの次の反復で、currentCellは、何も設定されています一致するセルであり、最初のブロックは最後のブロックの最後の行のセルの存在を返す。

修正 - 内側のループ内のセルを見つけるためのチェックを追加して、すぐに見つかったものをretrun:

foreach (XmlBlock block in section.Blocks)   
{ 
    foreach (XmlRow row in block.Rows)    
    {     
     currentCell = row.Cells.FirstOrDefault(cell => string.Equals(cell.Id, id));    
     if (currentCell != null) 
      return currentCell; 

    } 
} 
関連する問題