normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

ToLookupを使ってみる

普段使っておきながら、結構使いどころを忘れるToLookupメソッドなどを書いてみる。以下がサンプルコード&実行結果。

public static void Main(string[] args)
{
    List<int> intList = Enumerable.Range(1, 6).Concat(Enumerable.Range(1, 4)).ToList();
    List<string> strList = Enumerable.Range(1, 6).Select(n => "「" + n + "番!」").ToList();
    var query = from num in intList
                from str in strList
                where str.Contains(num.ToString())
                select new { n = num, s = str };
    query.ToList().ForEach(Console.WriteLine);
    Console.WriteLine("列の長さ = {0}", query.Count());
    Console.WriteLine("--- lookup start ----");
    var lookup = query.ToLookup(obj => obj.n > 3);
    foreach (var obj in lookup)
    {
        Console.WriteLine("key={0}, count={1}", obj.Key, lookup[obj.Key].Count());
    }
    Console.WriteLine("--- lookup end ----");
    Console.ReadLine();
}
//{ n = 1, s = 「1番!」 }
//{ n = 2, s = 「2番!」 }
//{ n = 3, s = 「3番!」 }
//{ n = 4, s = 「4番!」 }
//{ n = 5, s = 「5番!」 }
//{ n = 6, s = 「6番!」 }
//{ n = 1, s = 「1番!」 }
//{ n = 2, s = 「2番!」 }
//{ n = 3, s = 「3番!」 }
//{ n = 4, s = 「4番!」 }
//列の長さ = 10
//--- lookup start ----
//key=False, count=6
//key=True, count=4
//--- lookup end ----

ToLookupに対して「コレクション要素が引数、bool型が戻り値」のラムダ式を引数として与える。結果として、ラムダ式の結果がTrueとFalseのコレクションに分かれるので、その結果を取得することができる。