ページ

2011年4月15日金曜日

◆LINQでのコレクション変換処理

LINQの結果として返ってくるのは基本的に、IEnumerable<T>もしくはIQueryable<T>型である。
これを他のコレクションに変換したい場合はLINQに用意されている各種コレクション変換処理を行う。

以下のような感じだ。

  1. using (Pubs.PubsDataContext pubs = new Pubs.PubsDataContext())  
  2. {  
  3.     Console.WriteLine("■■■配列への変換(ToArray)■■■");  
  4.     string[] arrFname = pubs.authors.Select(a => a.au_fname).ToArray();  
  5.     foreach (string name in arrFname) Console.WriteLine(name);  
  6.   
  7.     Console.WriteLine("■■■LISTへの変換(ToList)■■■");  
  8.     var authList = pubs.authors.Select(a => new { a.au_id, a.au_lname, a.au_fname }).ToList();  
  9.     foreach (var a in authList) Console.WriteLine(" {0} {1} {2} ", a.au_id, a.au_fname, a.au_lname);  
  10.   
  11.     Console.WriteLine("■■■辞書への変換(ToDictionary)■■■");  
  12.     var authDic = pubs.authors.Select(a => new { a.au_id, name = a.au_fname + " " + a.au_lname })  
  13.         .ToDictionary(an => an.au_id,an => an.name);  
  14.     foreach (var a in authDic) Console.WriteLine(" {0} {1} ", a.Key,authDic[a.Key]);  
  15.   
  16.     Console.WriteLine("■■■マルチ辞書への変換(ToLookUp)■■■");  
  17.     var auth = pubs.authors.ToLookup(a => a.state, a => a.au_fname);  
  18.     foreach (var ag in auth)  
  19.     {  
  20.         Console.WriteLine(string.Format("◆{0}◆", ag.Key));  
  21.         foreach (var fname in auth[ag.Key])  
  22.         {  
  23.             Console.WriteLine("-- " + fname + " --");  
  24.         }  
  25.     }  
  26. }  

ここで目新しいのがToLookup、マルチ辞書って何だろう。
調べてみるとILookup型を返すようだ。そしてILookupを実装しているのがLookup型。
どうもLookup型とはDictionaryと同様な使い方をするが、Key指定で返ってくるのがコレクションになっているもののようだ。即ちKEYでグルーピングしてくれるわけだ。


グルーピングといえば、以前使ったGroupByがあるが違いはなんだろうと考えてみる。
Linq To SQLで言えば、GroupByはSQLによるグルーピング、Lookupはローカルメモリー内でのグルーピングという事だろう。
これが、Linq to Objectとなるとどちらもローカルメモリー内でのグルーピングとなるのだが、Lookupがダイレクトアクセス用、GrouByがシーケンシャルアクセス用。ダイレクトアクセスが必要なければGroupByのほうが軽い。なんて自分なりには解釈することとした。

0 件のコメント:

コメントを投稿

私が最近チェックした記事