Linq删除多个对象

时间:2017-12-10 17:38:51

标签: c# linq

我能够搜索列表中的每个项目,如果该项目存在,那么我将其从列表中删除,如下所示。

然而,我不是在编写那么多行代码,而是想知道有更好的方法。

var math = subclasses.Classes.Where(x => x.Id.Equals(Constants.Classes.Math.ToString())).FirstOrDefault();
if (math != null) subclasses.Classes.Remove(math);

var chem= subclasses.Classes.Where(x => x.Id.Equals(Constants.Classes.Chem.ToString())).FirstOrDefault();
if (chem!= null) subclasses.Classes.Remove(chem);

var physics= subclasses.Classes.Where(x => x.Id.Equals(Constants.Classes.Physics.ToString())).FirstOrDefault();
if (physics!= null) subclasses.Classes.Remove(physics);

3 个答案:

答案 0 :(得分:3)

如果ClassesList<>

,您可以在没有LINQ的情况下删除它们
subclasses.Classes.RemoveAll(x => x.Id.Equals(Constants.Classes.Math.ToString())
                               || x.Id.Equals(Constants.Classes.Chem.ToString())
                               || x.Id.Equals(Constants.Classes.Physics.ToString()));

答案 1 :(得分:1)

2个步骤:

  1. 编写一个重载版本的Remove(),其中包含要删除的列表。 (假设原始的Remove是您自己的实现,并且是一个名为Classes的类的方法)
  2. 使用Array.Contains()获取要删除的列表
  3. 像这样(在移动设备上,所以......):

    string [] mathChemPhy = new string []
    {
        Constants.Classes.Math.ToString(),
        Constants.Classes.Chem.ToString(),
        Constants.Classes.Physics.ToString()
    };
    
    var itemsToRemove = subclasses.Classes.Where(x => mathChemPhy.Contains(x.Id)).ToList();
    subclasses.Classes.Remove(itemsToRemove); // overloaded version of Remove that takes a list
    

答案 2 :(得分:1)

您可以使用Except扩展方法:

var exceptions = subclasses.Classes.Where(x => x.Id.Equals(Constants.Classes.Math.ToString() 
    || x.Id.Equals(Constants.Classes.Chem.ToString() 
    || x.Id.Equals(Constants.Classes.Physics.ToString());
var result = subclasses.Classes.Except(exceptions);