3

ここで問題が発生しています。観察可能なコレクションがあり、特定の基準を満たしている場合は、その中の一部を削除したいと思います。

コードは次のとおりです。

foreach (Record record in SwearJarController.Records)
        {
            if (record.Word == "Hi")
            {


                SwearJarController.Records.Remove(record);
                Datastore.DB.Records.DeleteOnSubmit(record);


            }
        }

Recordsはコレクションの名前であり、recordはクラスです。どうやら、それは「foreach」の部分で混乱します。

私は何をすべきか?

ありがとう!

4

3 に答える 3

7

列挙しているコレクションを変更することはできません。foreachでToArray()またはを実行する必要があります。ToList()

foreach (Record record in SwearJarController.Records.ToArray())
{
    if (record.Word == "Hi")
    {
            SwearJarController.Records.Remove(record);
            Datastore.DB.Records.DeleteOnSubmit(record);
    }
}

クリーンアップされたバージョン:

foreach (Record record in SwearJarController.Records
                          .Where(x => String.Equals(x.Word, "Hi")
                          .ToArray())
{
    SwearJarController.Records.Remove(record);
    Datastore.DB.Records.DeleteOnSubmit(record);
}

注:実際には列挙型もString.Equals(...)使用する必要があります。StringComparisonあなたの比較が大文字と小文字を区別することを意図していたのか、そして/または通常/現在の文化/不変の文化であるのかはわかりません。

于 2012-11-05T01:46:41.327 に答える
2

作業中はコレクションを変更できません。Records.Count から 0 までのカウントで for ループを実行し、その方法で削除できます。それはうまくいくはずです

例:

for(int x = SwearJarController.Records.Count - 1 ; x >= 0; x--)
{
    Record record = SwearJarController.Records[x];
    if(record.Word == "Hi")
    {
        SwearJarController.Records.Remove(record);
        Datastore.DB.Records.DeleteOnSubmit(record);
    }
}
于 2012-11-05T01:45:36.323 に答える
0

他の人がすでに言ったように、コレクションを繰り返し処理している間はコレクションを変更できません。

レコードを完全に削除するための最善の策は、次のことです。

foreach (var record in SwearJarController.Records
    .Where(r => r.Word == "Hi")
    .ToArray())
{
    SwearJarController.Records.Remove(record);
    Datastore.DB.Records.DeleteOnSubmit(record);
}

SwearJarController.Recordsこれにより、削除する前にコレクションがフィルタリングされ、スナップショットが作成されます。

最初にフィルタを実行すると、大きな配列が作成される可能性が制限されます。

于 2012-11-05T01:54:02.447 に答える