LINQ:select对象不包含列表中的项目

我在这里用LINQ语法挣扎…以为我会把它扔在这里。 我无法find我正在寻找什么地方。

好的,说我有这个:

public class Bar { public int BarId { get; set; } } public class Foo { public List<Bar> BarList { get; set; } } List<Foo> fooBunch = GetABunchOfFoos(); //let's just assume I'm getting more than one List<Foo> fooSelect = new List<Foo>; List<Bar> filterBars = GetAFewBars(); //assume I'm getting like 2 or 3 fooSelect = (from f in fooBunch where !(from b in f.BarList select b.BarId).Contains(ITEM FROM filterBars.BarId) select f).ToList(); 

所以,长话短说,我想用LINQ来过滤掉基于另一个列表中的对象的对象列表。 我希望这是有道理的。 我想我只是迷失在包含部分…我不知道该怎么写。

一般来说,您正在寻找“Except”扩展名。

 var rejectStatus = GenerateRejectStatuses(); var fullList = GenerateFullList(); var rejectList = fullList.Where(i => rejectStatus.Contains(i.Status)); var filteredList = fullList.Except(rejectList); 

在这个例子中,GenerateRegectStatuses()应该是你想要拒绝的状态列表(或者更具体的来说,基于你的例子,一个List<int>的ID)

把它转换成你不想要的ID的更具体的集合

 var notTheseBarIds = filterBars.Select(fb => fb.BarId); 

然后试试这个:

 fooSelect = (from f in fooBunch where !notTheseBarIds.Contains(f.BarId) select f).ToList(); 

或这个:

 fooSelect = fooBunch.Where(f => !notTheseBarIds.Contains(f.BarId)).ToList(); 

我没有尝试过,所以我不担保任何东西

 foreach Bar f in filterBars { search(f) } Foo search(Bar b) { fooSelect = (from f in fooBunch where !(from b in f.BarList select b.BarId).Contains(b.ID) select f).ToList(); return fooSelect; }