2012-10-03 72 views
2

最終結果是我想用.Where(t => someIntList.Contains(t.ID)).ToList()。我正在努力創造someIntList從列表<T>返回具有整數屬性的列表<int>?

我到目前爲止:List<Person> people = people.Where(p => p.isActive).ToList()。如何返回p.ID屬性的List<int>

或者有另一種方式做包含(不寫,因爲我已經有了用於其他目的一個比較器類

回答

7

好,生產List<int>容易,使用Select進行投影。

List<int> activeIds = people.Where(p => p.IsActive) 
          .Select(p => p.ID) 
          .ToList(); 

然而,而不是做的,然後用Contains,我將執行聯接:

var activePeople = people.Where(p => p.IsActive); 
var query = from person in otherList 
      join activePeople on person.ID equals activePeople.ID 
      select person; 

或者創建HashSet<int>代替List<int>,使Contains檢查更加高效:

var activeIds = new HashSet<int>(people.Where(p => p.IsActive) 
             .Select(p => p.ID)); 
var query = otherList.Where(t => activeIds.Contains(t.ID)) 
        .ToList(); 

這兩種會給O(M + N)的複雜查找所有比賽,而不是O(M * N)是構建一個清單,然後使用Contains檢查會做什麼。

當然,假設Contains檢查將在進程中完成。如果這是實際上打算在LINQ中使用到SQL查詢,然後將其可能是傳遞一個List<int>是好的 - 或者可能是聯接允許你做這一切在數據庫中。我們真的需要更多的背景給你很好的建議 - 但不要只是停止在「這是我如何建立一個List<T>,因此我完成了。」

+0

謝謝,給我一些想法。代碼比我試圖簡單的例子更復雜。 – Marcus

+0

@IgorK:您可以提供的信息越多,我們的答案就越有用。我們不能*真的*告訴你是否需要一個'List ',或者這是否正是你最初想到的。 –

+0

你能解釋一下如何創建HashSet ?我不明白你怎麼能傳遞一個IENumerable作爲參數? – Marcus