2

クエリの結果を複数のリストに選択するにはどうすればよいですか? 例えば、

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 回実行する必要があることです。アプローチ 2 の問題は、2 倍のメモリを使用することです。データセットが巨大な場合、問題になる可能性があります。

4

2 に答える 2

5

アプローチ 1 の問題は、クエリを 2 回実行する必要があることです。アプローチ 2 の問題は、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);
}

これにより、クエリ結果を 1 回だけ列挙し、余分な情報を保存しないため、2 つのクエリとアイテムの「コピー」が回避されます。

于 2012-06-27T15:56:46.557 に答える
0

アプローチ 2 の問題は、2 倍のメモリを使用することです。

違う。それを測定します。文字列インスタンスは再利用されます。

于 2012-06-27T18:30:14.463 に答える