LINQ - 拡張メソッド一覧
		
		
		
		
		
		ナビゲーションに移動
		検索に移動
		
 
 
 
 
 
 
 
		
	
概要
C#のLINQを種類ごとにまとめて、簡単なサンプルを記述する。
ここでは、結果の表示において、独自の拡張メソッドToResult(this IEnumerable)を使用している。
このメソッドを以下に記述する。
 // 結果表示用の拡張メソッド
 public static String ToResult<TSource>(this IEnumerable<TSource> source)
 {
    return "{" + string.Join(", ", source) + "}";
 }
 
 public static String ToResult<TKey, TSource>(this IEnumerable<IGrouping<TKey, TSource>> source)
 {
    return source.Select(group => string.Format("Key={0}, Source={1}", group.Key, group.ToResult())).ToResult();
 }
ソート
| メソッド名 | 機能 | 
|---|---|
| OrderBy | 昇順にソートしたシーケンスを返す。 | 
| OrderByDescending | 降順にソートしたシーケンスを返す。 | 
| ThenBy | ソートしたシーケンスに対し、キーが等しい要素同士を昇順にソートしたシーケンスを返す。 | 
| ThenByDescending | ソートしたシーケンスに対し、キーが等しい要素同士を降順にソートしたシーケンスを返す。 | 
| Reverse | 逆順にソートしたシーケンスを返す。 | 
 var source = new[] {
    new{Name = "C#", Age = 11},
    new{Name = "Java", Age = 16},
    new{Name = "Groovy", Age = 8},
    new{Name = "Scala", Age = 8},
 };
 
 Console.WriteLine(source.OrderBy(e => e.Age).ToResult());
 // → {{ Name = Groovy, Age = 8 },
 //     { Name = Scala, Age = 8 }, 
 //     { Name = C#, Age = 11 },
 //     { Name = Java, Age = 16 }}
 
 Console.WriteLine(source.OrderByDescending(e => e.Age).ToResult());
 // → {{ Name = Java, Age = 16 },
 //     { Name = C#, Age = 11 },
 //     { Name = Groovy, Age = 8 },
 //     { Name = Scala, Age = 8 }}
 
 Console.WriteLine(source.OrderBy(e => e.Age).ThenBy(e => e.Name.Length).ToResult());
 // → {{ Name = Scala, Age = 8 },
 //     { Name = Groovy, Age = 8 },
 //     { Name = C#, Age = 11 },
 //     { Name = Java, Age = 16 }}
 
 Console.WriteLine(source.OrderBy(e => e.Age).ThenByDescending(e => e.Name.Length).ToResult());
 // → {{ Name = Groovy, Age = 8 },
 //     { Name = Scala, Age = 8 },
 //     { Name = C#, Age = 11 },
 //     { Name = Java, Age = 16 }}
 
 Console.WriteLine(source.Reverse().ToResult());
 // → {{ Name = Scala, Age = 8 },
 //     { Name = Groovy, Age = 8 },
 //     { Name = Java, Age = 16},
 //     { Name = C#, Age = 11 }}
射影
| メソッド名 | 機能 | 
|---|---|
| Select | 1つの要素を単一の要素に射影する。 | 
| SelectMany | 1つの要素から複数の要素に射影する。その結果を1つのシーケンスとして返す。 | 
| GroupBy | 指定のキーで要素をグループ化する。その"キーとグループ" のシーケンスを返す。 | 
 var source = new[] {
    new{Name = "C#", Age = 11},
    new{Name = "Java", Age = 16},
    new{Name = "Groovy", Age = 8},
    new{Name = "Scala", Age = 8},
 };
 
 Console.WriteLine(source.Select(e => e.Name).ToResult());
 // → {C#, Java, Groovy, Scala}
 
 Console.WriteLine(source.SelectMany(e => e.Name.ToCharArray()).ToResult());
 // → {C, #, J, a, v, a, G, r, o, o, v, y, S, c, a, l, a}
 
 Console.WriteLine(source.GroupBy(e => e.Age).ToResult());
 // → {Key=11, Source={{ Name = C#, Age = 11 }},
 //     Key=16, Source={{ Name = Java, Age = 16 }},
 //     Key=8, Source={{ Name = Groovy, Age = 8 }, { Name = Scala, Age = 8 }}}
結合
| メソッド名 | 機能 | 
|---|---|
| Join | 内部結合を行ったシーケンスを返す。 | 
| GroupJoin | 左外部結合を行って指定のキーでグループ化する。その "キーとグループ" のシーケンスを返す。 | 
| Concat | 2つのシーケンスを連結する。(Unionは同じ要素を一つにまとめるが、Concatは元の要素をすべて返す) | 
| DefaultIfEmpty | シーケンスを返す。シーケンスが空なら、規定値もしくは任意の要素を返す。 | 
| Zip | 指定した関数で、2つのシーケンスを1つのシーケンスにマージする。 | 
 var outer = new[] {
    new{Name = "C#", Age = 11},
    new{Name = "Java", Age = 16},
    new{Name = "Groovy", Age = 8},
    new{Name = "Scala", Age = 8},
 };
 var outer2 = new[] {
    new{Name = "Python", Age = 21},
    new{Name = "COBOL", Age = 52},
 };
 var inner = new[] {
    new{Name = "C#", DesignedBy = "Microsoft"},
    new{Name = "Java", DesignedBy = "Sun Microsystems"},
    new{Name = "Java", DesignedBy = "Oracle"},
 };
 
 Console.WriteLine(outer.Join(inner, o => o.Name, i => i.Name, (o, i) => new { o.Name, o.Age, i.DesignedBy}).ToResult());
 // → {{ Name = C#, Age = 11, DesignedBy = Microsoft },
 //     { Name = Java, Age = 16, DesignedBy = Sun Microsystems },
 //     { Name = Java, Age = 16, DesignedBy = Oracle }}
 
 Console.WriteLine(outer.GroupJoin(inner, o => o.Name, i => i.Name, (o, i) =>
                                   new { o.Name, o.Age, DesigndBy = i.Select(e => e.DesignedBy).ToResult() }).ToResult());
 // → {{ Name = C#, Age = 11, DesigndBy = {Microsoft} },
 //     { Name = Java, Age = 16, DesigndBy = {Sun Microsystems, Oracle} },
 //     { Name = Groovy, Age = 8, DesigndBy = {} },
 //     { Name = Scala, Age = 8, DesigndBy = {} }}
 
 Console.WriteLine(outer.Concat(outer2).ToResult());
 // → {{ Name = C#, Age = 11 },
 //     { Name = Java, Age = 16 },
 //     { Name = Groovy, Age = 8 },
 //     { Name = Scala, Age = 8 },
 //     { Name = Python, Age = 21 },
 //     { Name = COBOL, Age = 52 }}
 
 Console.WriteLine(outer.DefaultIfEmpty().ToResult());
 // → {{ Name = C#, Age = 11 },
 //     { Name = Java, Age = 16 },
 //     { Name = Groovy, Age = 8 },
 //     { Name = Scala, Age = 8 }}
 
 Console.WriteLine(outer.Zip(outer2, (o1, o2) => o1.Name + "&" + o2.Name).ToResult());
 // → {C#&Python, Java&COBOL}
変換
| メソッド名 | 機能 | 
|---|---|
| OfType | 各要素を指定した型に変換する。 キャストできない要素は除外する。 | 
| Cast | 各要素を指定した型に変換する。 キャストできない要素が含まれていた場合、例外をスローする。 | 
| ToArray | 配列を作成する。 | 
| ToDictionary | 連想配列(ディクショナリ)を作成する。 | 
| ToList | リストを作成する。 | 
| ToLookup | キーコレクション*1を生成する。 IEnumerableと同じ名前のメソッドがクラス内に定義されている場合に使用する。 そのままだと、クラス内のメソッドが優先的に選択されて、 IEnumerableの拡張メソッドが呼びだせないためである。 | 
| AsEnumerable | IEnumerableを返す。 1対多のディクショナリである。 例えば、〜.ToLookup()["hoge"]と実行すると、hogeに紐付く要素の集合(IEnumerable)が返る。 | 
 ArrayList mixed = new ArrayList { "C#", "Java", 3.141592653, "Groovy", "Scala" };
 
 Console.WriteLine(mixed.OfType<string>().ToResult());
 // → {C#, Java, Groovy, Scala}
 
 Console.WriteLine(mixed.Cast<string>().ToResult());
 // → System.InvalidCastException: 
 //    型 'System.Double' のオブジェクトを型 'System.String' にキャストできません。