C# 从嵌入列表中删除项目<;对象>;使用LINQ

C# 从嵌入列表中删除项目<;对象>;使用LINQ,c#,linq,class,C#,Linq,Class,我的班级结构如下 public class Foo : IComparable<Foo> { public List<Bar> Bars; } public class Bar : IComparable<Bar> { public List<Con> Cons; } public class Con : IComparable<Con> { ... } 但是,对于上面的类,如何从基本对象Foo中删除名

我的班级结构如下

public class Foo : IComparable<Foo> 
{
    public List<Bar> Bars;
}

public class Bar : IComparable<Bar> 
{
    public List<Con> Cons;
}

public class Con : IComparable<Con>
{
    ...
}
但是,对于上面的类,如何从基本对象
Foo
中删除名为
badConList
List
?明确地说,类层次结构的填充方式如下

Foo foo = new Foo();
foo.Bars = new List<Bar>() { /* Some Bar list */ };
foreach (Bar bar in foo.Bars)
    bar.Cons = new List<Con>() { /* Some Con list */ };

// Now a bad Con list.
List<Con> badCons = new List() { /* Some bad Con list */ };
Foo-Foo=new-Foo();
foo.Bar=new List(){/*Some Bar List*/};
foreach(食品酒吧中的酒吧)
Cons=new List(){/*一些Con List*/};
//现在是一份糟糕的罪犯名单。
List badCons=new List(){/*一些坏的Con List*/};
如何使用LINQ从
foo
中删除每个
Bar
badcon

谢谢你抽出时间


Ps.LINQ可能不是这里最快的方法;一个简单的循环可能是(这就是LINQ在引擎盖下要做的事情)。您也可以对此发表评论吗?

您仍然可以使用
RemoveAll

bar.Cons.RemoveAll(x => badCons.Contains(x));
另一种解决方案是使用循环:

foreach(var badCon in badCons)
    bar.Cons.Remove(badCon);
两个版本都多次循环其中一个列表:

  • 第一个版本循环
    badCons
    N次,其中N为
    bar.Cons.Count()
  • 第二个版本循环
    bar.Cons
    N次,其中N为
    badCons.Count()

  • 如果两个列表中的一个大于另一个,最好选择只循环一次大列表的版本,否则使用您和代码库读者更容易理解的版本。

    或者对于第二个列表上的一行,您可以执行
    badCons.ForEach(b=>bar.Cons.Remove(b))
    :)@mattytommo:我不喜欢这种方法,因此避免使用它。有关更多信息,请参阅。我遇到的问题是,有一个
    Bar
    s列表,我也必须对其进行评分。我如何将其合并到上述LINQ版本中?我希望这是清楚的。。。谢谢你的时间,Daniel。使用这里解释的List.ForEach方法@Killercam:你可以像其他人建议的那样使用
    ForEach
    方法,但我看不到任何好处。事实上,我认为这会损害可读性:
    bar.ForEach(bar=>bar.RemoveAll(x=>badCons.Contains(x))
    badCons.ForEach(x=>bar.ForEach(bar=>bar.Cons.Remove(x))
    foreach(var badCon in badCons)
        bar.Cons.Remove(badCon);