ページ

2011年4月15日金曜日

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

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

以下のような感じだ。

            using (Pubs.PubsDataContext pubs = new Pubs.PubsDataContext())
{
Console.WriteLine("■■■配列への変換(ToArray)■■■");
string[] arrFname = pubs.authors.Select(a => a.au_fname).ToArray();
foreach (string name in arrFname) Console.WriteLine(name);

Console.WriteLine("■■■LISTへの変換(ToList)■■■");
var authList = pubs.authors.Select(a => new { a.au_id, a.au_lname, a.au_fname }).ToList();
foreach (var a in authList) Console.WriteLine(" {0} {1} {2} ", a.au_id, a.au_fname, a.au_lname);

Console.WriteLine("■■■辞書への変換(ToDictionary)■■■");
var authDic = pubs.authors.Select(a => new { a.au_id, name = a.au_fname + " " + a.au_lname })
.ToDictionary(an => an.au_id,an => an.name);
foreach (var a in authDic) Console.WriteLine(" {0} {1} ", a.Key,authDic[a.Key]);

Console.WriteLine("■■■マルチ辞書への変換(ToLookUp)■■■");
var auth = pubs.authors.ToLookup(a => a.state, a => a.au_fname);
foreach (var ag in auth)
{
Console.WriteLine(string.Format("◆{0}◆", ag.Key));
foreach (var fname in auth[ag.Key])
{
Console.WriteLine("-- " + fname + " --");
}
}
}

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


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

0 件のコメント:

コメントを投稿

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