Linq:将数据选择到多个列表中

Can*_*hiu 2 c# linq entity-framework linq-to-sql

如何将查询结果选择到多个列表中?例如,

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();
}
Run Code Online (Sandbox Code Playgroud)

方法 1 的问题是我需要运行查询两次。方法 2 的问题是我使用了两倍的内存。当数据集很大时,这可能会成为一个问题。

Ree*_*sey 5

方法 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);
}
Run Code Online (Sandbox Code Playgroud)

这避免了两次查询以及项目的“复制”,因为您只枚举查询结果一次,并且不存储任何额外的信息。

  • 有趣的是——为什么投反对票?这确实解决了所提出的两个问题。 (2认同)