1

私は次のものを持っています:

 tempLabID = lstLab;
                    foreach (string labID in lstLab)
                    {
                        if (fr.GetFileRecipients(fsID).Contains(labID))
                        {
                            tempLabID.Remove(labID);
                        }
                    }   

lstLab をデバッグして監視し、tempLabID.remove() に到達すると、lstLab が 1 から 0 に変更され、次に foreach に戻ると、コレクションが変更されたことを示すエラーが表示されます。

なぜそれが起こっているのか理解できません。別のコレクションを変更しています。

4

6 に答える 6

5

いいえ、同じコレクションを変更しています。同じコレクションを指す 2 つの変数があります。コレクションを機能させるには、最初の行でコレクションを複製する必要があります。

その問題が発生しないようにコードを変更できます。

lstLab.RemoveAll( labID => fr.GetFileRecipients(fsID).Contains(labID) );

これにより、ループや一時コピーを必要とせずに、削除したいものがすべて削除されます。

于 2013-09-10T16:28:08.623 に答える
1

あなたはそれをすることはできません。

変更

tempLabID = lstlab;

tempLabID = lstLab.ToList();

于 2013-09-10T16:28:05.700 に答える
1

tempLabIDとの両方lstLabが同じコレクションを指しているため、別のコレクションを変更していません。

試す:

tempLabID = lstLab.ToList();
于 2013-09-10T16:28:14.183 に答える
0

この状況では、通常、リストを逆方向にループします。(あまり派手ではありませんが、うまくいきます。)

    for (int x = lstLab.Count - 1; x >= 0; x--)
    {
        string labId = lstLab[x];
        if (fr.GetFileRecipients(fsID).Contains(labID))        
           lstLab.RemoveAt(x);        
    }
于 2013-09-10T17:54:49.320 に答える
0

これで問題が解決します:

tempLabID = lstLab.Where(l => fr.GetFileRecipients(fsID).Contains(l)).ToList();

詳細については、Jon Skeets の回答を参照してください。

于 2013-09-10T16:36:33.317 に答える
0

tempLabID = lstLab は参照 (ポインター) をコレクションにコピーするため、同じコレクションを変更していますが、コレクションは複製されません。

おそらくコレクションをクローンしたいと思うでしょう:

tempLabID = lstLab.ToArray();
于 2013-09-10T16:29:21.330 に答える