2011-04-12 142 views
62

我在这里苦苦寻找LINQ语法......我想我会在这里抛弃它。我找不到我正在寻找的其他地方。LINQ:选择对象不包含来自列表中的项目的位置

OK,说我有这样的:

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过滤掉我的基础上从另一个列表中的对象的对象列表。我希望这是有道理的。我想我只是迷失在Contains部分......我不知道该怎么写。

回答

94

通常,您正在寻找“Except”扩展名。

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

在这个例子中,GenerateRegectStatuses()应该是你想拒绝的状态列表(或者更具体地根据你的榜样,ID的List<int>

+0

这是非常接近...窍门是从动态状态创建rejectList。这将更像是我在哪里> i.Status(列表)。我可以做那样的事吗?基本上我猜想另一个LINQ声明? – farina 2011-04-12 19:23:40

+1

当然,要构建rejectList,你只需要设计一个方法来获得你不想要的拒绝列表。 例如:'var rejectList = fullList.Where(i => rejectStatuses.Contains(i.Status));' 我将更新我的原始答案以反映此更改。 – Thebigcheeze 2011-04-12 19:36:32

+1

我会如何在一行中做到这一点?我知道这可能是不可能的。 – JustJohn 2016-05-28 00:33:58

50

转储到这个更具体只是IDS的收集你不想

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(); 
+0

不错。我更喜欢这个答案。 +1 – JoshYates1980 2015-04-03 19:37:36

+0

这个回答比选中的要好 – Rarepuppers 2018-03-06 17:15:30

4

我还没有试过,所以我不guarantueeing什么,但是

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; 
} 
+2

从我所知道的情况来看,b.ID不能编译。 Contains方法似乎松散了b的上下文。 – farina 2011-04-12 19:29:10

+2

您正在使用两个名为'b'的变量,并且编译器可能会发现它不明确。 – 2011-04-12 20:15:09

0

试试这个简单的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(); 
相关问题