2012-06-27 49 views
1

如何將查詢結果選擇到多個列表中?例如,Linq:將數據選擇到多個列表

class Person 
{ 
    public string FirstName {get;set;} 
    public string LastName {get;set;} 
} 

void test() 
{ 
    var query = 
    from i in Persons 
    select i; 

    // now i want to select two lists - list of first names, and list of last names 

    // approach 1 - run query twice? 
    List<string> f = query.Select(i=>i.FirstName).ToList(); 
    List<string> l = query.Select(i=>i.LastName).ToList(); 

    // approach 2 - turn it into a list first, and break it up 
    List<Person> p = query.ToList(); 
    List<string> f = p.Select(i=>i.FirstName).ToList(); 
    List<string> l = p.Select(i=>i.LastName).ToList(); 
} 

問題與方法1是我需要運行查詢兩次。 方法2的問題是我使用了兩倍的內存。數據集龐大時,可能會成爲問題。

+0

如果數據集很大,任何查詢都會成爲問題。數據集是否會變得「巨大」? –

+1

你打算如何使用這些列表?也許沒有必要製作2個單獨的列表。 – spender

+0

是的,這是必要的。結果將作爲兩個列表提供給另一個API。 –

回答

4

問題與方法1是我需要運行查詢兩次。方法2的問題是我使用了兩倍的內存。數據集龐大時,可能會成爲問題。

這些折衷之一可能是足夠的,但它取決於所得到的數據集和用例。

但是,如果您想完全避免這種折衷,您可以。解決這個問題的方法是不使用Linq:

var firstNames = new List<string>(); 
var lastNames = new List<string>(); 
foreach(var person in query) 
{ 
    firstNames.Add(person.FirstName); 
    lastNames.Add(person.LastName); 
} 

這避免了兩個查詢,以及在項目的「複製」,因爲你只列舉查詢結果一次,不存儲任何額外的信息。

+0

你是第一個:) +1 – Vlad

+2

有趣的是,爲什麼downvoting?這確實處理了所提出的兩個問題。 –

+1

可能因爲您沒有使用Linq命名空間中的「SelectAndAddToMultipleCollections」方法而被投票。 –

0

問題與方法2是我使用了兩倍的內存。

錯誤。衡量它。字符串實例被重用。