LINQ: 从列表中选择对象不包含项的位置

我正在纠结 LINQ 的语法... 我想我应该把它扔在这里。我在别的地方找不到我要找的东西。

好吧,假设我有这个:

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 过滤出我的对象列表的基础上的对象从另一个列表。我希望这能说得通。我想我只是迷失在“包含”部分了... 我不知道该怎么写。

219014 次浏览

一般来说,你要找的是“除外”分机。

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

在这个示例中,GenerateRegectStatuses ()应该是您希望拒绝的状态列表(或者根据您的示例,更具体地说,是 ID 的 List<int>)

将这个文件转储到一个更具体的集合中,其中包含您不需要的 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;
}

试试这个简单的 LINQ:

//For a file list/array
var files = Directory.GetFiles(folderPath, "*.*", SearchOption.AllDirectories);


//simply use Where ! x.Contains
var notContain = files.Where(x => ! x.Contains(@"\$RECYCLE.BIN\")).ToList();


//Or use Except()
var containing = files.Where(x => x.Contains(@"\$RECYCLE.BIN\")).ToList();
notContain = files.Except(containing).ToList();