2009-07-23 19 views
2

私は反復処理が必要なデータセットの行のリストを持っています。変更されているリストを反復処理する方法は?

問題は、繰り返し処理でリストから1つ以上の行が削除される可能性があることです。

リストが変更されているので、私はforeach()ループを使用できません。

しかし、私が処理している前に要素の中にいくつかの削除が発生する可能性があるので、for()ループも使用できません(つまり、要素を処理している場合、要素や他の要素の削除、私は正しく私が処理していたものに続く要素を指すように調整する方法を考えることはできません)。

この問題にどのように対処しますか?私は現在、リストの最初の要素を常に処理すると考えていました。削除された場合は、新しい最初の要素を処理します。削除されない場合は、「alreadyProcessed」リストに移動し、新しい最初の要素を処理します。

もっと簡単な方法はありますか?

答えて

2

行う。

実際には、完了したらデータを使って何をやっているかによって決まります。

+0

それは私が向かっている方向です。確認していただきありがとうございます。 –

8

通常、これは逆ループで行われます

List<string> Items = ... 
for(int i = Items.Count - 1; i >= 0; i--) 
{ 
    if(Items[i] == "DELETE ME") 
    { 
     Items.RemoveAt(i); 
    } 
} 

これはアイテムは逆の順序で処理されますので、あなたがアイテムを削除した場合、それがあることを今でも任意の項目の位置には影響を与えません。処理される。私は繰り返し処理てるリストを変更する場合、私はいつも、私は維持したい項目を使用して新しいリストを作成し、それは私がするつもりだっただったものは何でもする新しいリストを使用することが最も簡単見つける

+0

削除は要素iだけでなく他の要素i +/- nでも発生する可能性があるため、これは私が検討している場合には機能しません。正しい次の要素で。また、複数の要素を削除すると、リストの終わりを越えて存在しないオブジェクトを指し示す可能性があります。 (削除された可能性のある要素の数は必ずしもわかっていないことに注意してください) –

0
for(int i = list.Length -1, i >= 0; i--) 
{ 
    // process and delete if you want 
} 
+0

'i'を宣言してください。 – Dario

+0

上記のDavidへの私のコメントを参照してください。 –

0


int i = 0; 
while (i < dataSet.Tables[0].Rows.Count) { 
    if (some_condition) { 
     dataSet.Tables[0].Rows.RemoveAt(i); 
     continue; 
    } 
    i++; 
} 
+0

複数の削除が発生した場合(私が容易に知ることのできない状態)、i(またはi ++)は正しい次の要素を指しません。 (1つ以上の削除が発生する理由は、1対多の関係でカスケード削除が行われるためです) –

+0

はい、行を削除(削除しない)した場合です。しかし、私の例では、DataTableから行を削除しています。 Delete()を使用すると、ループ内の各行のRowState == RowState.Deletedを確認できます。 –

0

データをリンクリストに入れることができれば、あなたは金色です。

関連する問題