删除符合条件的所有对象

时间:2012-06-07 18:39:50

标签: c#

鉴于

        List<LabEntity> selected = originalSettings.SelectedInstanceLabs;
        List<LabEntity> available = Presenter.GetLabs(dateRange);
        if (!firstLoad)
        {
            //Remove selected labs from the available labs
            available.Remove(?);// Remove Where selected.Id = available.Id
        }  

是否有可以完成多项任务的扩展方法?仅删除一次只能处理一个。其他删除类型的方法也不适合任务。我可以在那里坚持一个foreach,但是必须有一个更简洁的实现。

4 个答案:

答案 0 :(得分:6)

当然可以!

available.RemoveAll( ~delegate goes here~)

喜欢的东西; available.RemoveAll(a => selected.Exists(s => s.Id == a.Id));

请原谅我的4.0委托语法,不知道你使用的是什么版本......

修改:从评论更新(@vcsjones)

答案 1 :(得分:3)

你是说这个意思吗? :

        List<LabEntity> selected = originalSettings.SelectedInstanceLabs;
        List<LabEntity> available = Presenter.GetLabs(dateRange);
        if (!firstLoad)
        {
            //Remove selected labs
            available = available.Except<LabEntity>(selected).ToList();
        }  

答案 2 :(得分:0)

如果您对LINQ感到满意,可以在开头过滤它们:

var selectedSet = HashSet<LabEntry>(selected);
var available = Presenter.GetLabs(dateRange).Where(l => !selectedSet.Contains(l));

或者你可以过滤post hoc:

available.RemoveAll(l => selectedSet.Contains(l));

在这两者中,第一个应该更快,因为它避免了仅仅为了从中删除项目而创建一个集合。

答案 3 :(得分:0)

沿着这些方向做的事情就是这样:

available.RemoveAll(x => selected.Contains(y => (y.Id == x.Id)));