普段使っておきながら、結構使いどころを忘れる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のコレクションに分かれるので、その結果を取得することができる。