0

给定

        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
        }  

有没有可以完成多项任务的扩展方法?删除一次只适用于一个。其他 Remove 类型的方法似乎也不能胜任这项任务。我可以在那里粘贴一个 foreach,但必须有一个更简洁的实现。

4

4 回答 4

6

当然可以!

available.RemoveAll( ~delegate goes here~)

就像是; available.RemoveAll(a => selected.Exists(s => s.Id == a.Id));

请原谅我的 4.0 委托语法,不确定您使用的是什么版本...

编辑:从评论更新(@vcsjones)

于 2012-06-07T18:41:24.350 回答
3

你的意思是这样吗?:

        List<LabEntity> selected = originalSettings.SelectedInstanceLabs;
        List<LabEntity> available = Presenter.GetLabs(dateRange);
        if (!firstLoad)
        {
            //Remove selected labs
            available = available.Except<LabEntity>(selected).ToList();
        }  
于 2012-06-07T18:49:51.983 回答
0

如果您对 LINQ 很满意,您可以在开始时过滤它们:

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

或者您可以过滤事后:

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

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

于 2012-06-07T18:42:05.420 回答
0

沿着这些路线的东西会做到这一点:

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

于 2012-06-07T18:45:31.273 回答