2011-04-12 143 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(); 
相關問題