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()or :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

在处理该集合时,您无法对其进行修改。您可以运行一个 for 循环,计数从 Records.Count 下降到 0 并以这种方式删除。那应该工作

例子:

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 回答