删除列表中的项目并继续搜索

时间:2019-02-27 14:42:48

标签: c# list

有什么办法可以搜索List<T>并删除空白项目?

 ObservableCollection ListOfTnAGroupAccs <Model>

        foreach (var item in ListOfTnAGroupAccs)
        {
            if(item.Prefix == "" && item.ReportingGrp == "" && item.AccMngInitials == "" && item.Description == "")
            {
                ListOfTnAGroupAccs.Remove(item);
                continue;
            }
        }

它给我“集合被修改;枚举操作可能无法执行”

我可以使用

        var nList = ListOfTnAGroupAccs.Where(l => l.Prefix != "" && l.ReportingGrp != "" && l.AccMngInitials != "" && l.Description != "").ToList();

但是我的好奇心还有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

在迭代时无法删除项目,因此也无法删除。一种方法是定期向后进行循环:

for(int i = ListOfTnAGroupAccs.Length -1; i >= 0; --i)
{
    var item = ListOfTnAGroupAccs[i];
    if(item.Prefix == "" && item.ReportingGrp == "" && item.AccMngInitials == "" && item.Description == "")
    {
        ListOfTnAGroupAccs.Remove(item);
        continue;
    }
}

答案 1 :(得分:0)

它发生的方式是您要循环访问要修改的集合,这可能会中断迭代。

最好的方法是向后循环:

CustomerID  PhoneNumber CreatedDate
2222        7654312     2013-02-05
1111        1243557     2013-09-11

答案 2 :(得分:0)

使用for循环代替foreach。

for (int i = ListOfTnAGroupAccs.Count-1; i>=0; i--)
{
    if(ListOfTnAGroupAccs[i].Prefix == "" && ListOfTnAGroupAccs[i].ReportingGrp == "" && ListOfTnAGroupAccs[i].AccMngInitials == "" && ListOfTnAGroupAccs[i].Description == "")
    {
        ListOfTnAGroupAccs.RemoveAt(i);
        continue;
    }
}

由于我们删除了项目,因此我们以相反的顺序浏览列表。这样我们就可以防止IndexOutOfRangeException