2011-10-31
LINQの拡張メソッド一覧と、ほぼ全部のサンプルを作ってみました。
C#のLINQメソッドは超便利!!、なんですが…肝心のAPIがわかりづらいです。
そこで、種類ごとにまとめて、簡単なサンプルを書いてみました。
- 結果の表示に、独自の拡張メソッド ToResult(this IEnumerable<TSource>) を使用しています。このメソッドは、本文の最後に記載しています。
- サンプルコードのダウンロードはこちら。
要素の取得(単一)
| メソッド名 | 機能 |
|---|---|
| ElementAt ElementAtOrDefault | 指定した位置(インデックス)にある要素を返します。 |
| First FirstOrDefault | 最初の要素を返します。 |
| Last LastOrDefault | 最後の要素を返します。 |
| Single SingleOrDefault | 唯一の要素を返します。該当する要素が複数ある場合、例外をスローします。 |
該当の要素がない場合は…
「〜OrDefault」が付いていないメソッドは例外をスローします。
「〜OrDefault」が付いたメソッドは型の規定値を返します。
var source = new[] { 11, 16, 52, 21, 8, 8 }; Console.WriteLine(source.ElementAt(2)); // -> 52 Console.WriteLine(source.ElementAtOrDefault(8)); // -> 0 Console.WriteLine(source.First()); // -> 11 Console.WriteLine(source.First(e => e > 15)); // -> 16 Console.WriteLine(source.Last()); // -> 8 Console.WriteLine(source.Last(e => e > 15)); // -> 21 //Console.WriteLine(source.Single()); // -> System.InvalidOperationException: シーケンスに複数の要素が含まれています Console.WriteLine(source.Single(e => e > 50)); // -> 52
要素の取得(複数)
| メソッド名 | 機能 |
|---|---|
| Where | 条件を満たす要素をすべて返します。 |
| Distinct | 重複を除いたシーケンスを返します。 |
| Skip | 先頭から指定された数の要素をスキップし、残りのシーケンスを返します。 |
| SkipWhile | 先頭から指定された条件を満たさなくなるまで要素をスキップし、残りのシーケンスを返します。 |
| Take | 先頭から指定された数の要素を返します。 |
| TakeWhile | 先頭から指定された条件を満たす要素を返します。 |
var source = new[] { 11, 16, 52, 21, 8, 8 }; Console.WriteLine(source.Where(e => e > 20).ToResult()); // -> {52, 21} Console.WriteLine(source.Distinct().ToResult()); // -> {11, 16, 52, 21, 8} Console.WriteLine(source.Skip(3).ToResult()); // -> {21, 8, 8} Console.WriteLine(source.SkipWhile(e => e < 20).ToResult()); // -> {52, 21, 8, 8} Console.WriteLine(source.Take(3).ToResult()); // -> {11, 16, 52} Console.WriteLine(source.TakeWhile(e => e < 20).ToResult()); // -> {11, 16}
集計
| メソッド名 | 機能 |
|---|---|
| Max | 最大値を返します。 |
| Min | 最小値を返します。 |
| Average | 平均値を返します。 |
| Sum | 合計を返します。 |
| Count | 要素数を返します。 |
| Aggregate | アキュムレータ関数で処理した結果を返します。 |
var source = new[] { 11, 16, 52, 21, 8, 8 }; Console.WriteLine(source.Max()); // -> 52 Console.WriteLine(source.Min()); // -> 8 Console.WriteLine(source.Average()); // -> 19.3333333333333 Console.WriteLine(source.Sum()); // -> 116 Console.WriteLine(source.Count()); // -> 6 Console.WriteLine(source.Aggregate((now, next) => Math.Max(now, next))); // -> 52 // 参考:標本分散 double ave = source.Average(); Console.WriteLine(source.Sum(e => Math.Pow(e - ave, 2)) / source.Count()); // -> 234.555555555556
判定
| メソッド名 | 機能 |
|---|---|
| All | すべての要素が条件を満たしてるか判定します。 |
| Any | 条件を満たす要素が含まれているか判定します。 |
| Contains | 指定した要素が含まれているかどうかを判定します。 |
| SequenceEqual | 2つのシーケンスが等しいかどうかを判定します。 |
var source = new[] { 11, 16, 52, 21, 8, 8 }; Console.WriteLine(source.All(e => e > 10)); // -> False Console.WriteLine(source.Any(e => e > 10)); // -> True Console.WriteLine(source.Contains(20)); // -> False Console.WriteLine(source.SequenceEqual(new[] { 11, 16, 21, 52, 8, 8 })); // -> False
集合
| メソッド名 | 機能 |
|---|---|
| Union | 指定したシーケンスとの和集合を返します。 |
| Except | 指定したシーケンスとの差集合を返します。 |
| Intersect | 指定したシーケンスとの積集合を返します。 |
var first = new[] { 11, 16, 52, 21, 8, 8 }; var second = new[] { 16, 21, 20, 3 }; Console.WriteLine(first.Union(second).ToResult()); // -> {11, 16, 52, 21, 8, 20, 3} Console.WriteLine(first.Except(second).ToResult()); // -> {11, 52, 8} Console.WriteLine(first.Intersect(second).ToResult()); // -> {16, 21}
ソート
| メソッド名 | 機能 |
|---|---|
| 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を生成します。 |
| AsEnumerable | IEnumerable<T> を返します。*2 |
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' にキャストできません。
補足 - 結果表示用の拡張メソッド
static String ToResult<TSource>(this IEnumerable<TSource> source) { return "{" + string.Join(", ", source) + "}"; } 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(); }
コメントを書く
トラックバック - http://d.hatena.ne.jp/chiheisen/20111031/1320068429
リンク元
- 82 http://www.google.co.jp/url?sa=t&rct=j&q=java7&source=web&cd=2&ved=0CD8QFjAB&url=http://d.hatena.ne.jp/chiheisen/20110801/1312119289&ei=88yuToXeD9DymAXG_qWGDw&usg=AFQjCNEIHRkR3bTf6_9MY2XR-qGjfeENdw
- 31 http://t.co/DAn0GGvl
- 19 http://www.google.co.jp/url?sa=t&rct=j&q=java+%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%90%8D&source=web&cd=2&ved=0CC8QFjAB&url=http://d.hatena.ne.jp/chiheisen/20101010/1286697081&ei=q5WwTs3sF8eKmQX0lqSUAg&usg=AFQ
- 19 http://www.google.co.jp/url?sa=t&rct=j&q=java7&source=web&cd=2&sqi=2&ved=0CD0QFjAB&url=http://d.hatena.ne.jp/chiheisen/20110801/1312119289&ei=qqauTvHED8vymAWTvJGEDw&usg=AFQjCNEIHRkR3bTf6_9MY2XR-qGjfeENdw&cad=rja
- 19 http://www.google.co.jp/url?sa=t&rct=j&q=runtimeexception&source=web&cd=5&ved=0CFUQFjAE&url=http://d.hatena.ne.jp/chiheisen/20090531/1243745909&ei=A4yvTv7OJYr8mAXoo8CyAg&usg=AFQjCNFhnX_MH4gh_XjaQN1R9o5bytc4LQ&sig2=LyE6tEnl0sBP3FxS8DJ2Yw&cad=rj
- 17 http://www.google.co.jp/url?sa=t&rct=j&q=%E3%82%B5%E3%82%AF%E3%83%A9%E3%82%A8%E3%83%87%E3%82%A3%E3%82%BF+%E3%82%BD%E3%83%BC%E3%83%88&source=web&cd=1&ved=0CCcQFjAA&url=http://d.hatena.ne.j
- 17 http://www.google.co.jp/url?sa=t&rct=j&q=java 現在時刻 timestamp&source=web&cd=1&sqi=2&ved=0CCcQFjAA&url=http://d.hatena.ne.jp/chiheisen/20091123/1258986655&ei=F0-vTvTyEuOgmQXC4N2vAg&usg=AFQjCNF8HZg0MjNxD96uL-d8
- 15 http://www.google.co.jp/url?sa=t&rct=j&q=%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89%E5%90%8D%E3%80%80change+java&source=web&cd=8&ved=0CFoQFjAH&url=http://d.hatena.ne.jp/chiheisen/20101010/1286697081&ei=0uKwTprxB
- 15 http://www.google.co.jp/url?sa=t&rct=j&q=java+timestamp+%E7%94%9F%E6%88%90%E3%80%80%E7%8F%BE%E5%9C%A8%E6%99%82%E5%88%BB&source=web&cd=1&ved=0CBwQFjAA&url=http://d.hatena.ne.jp/chiheisen/20091123/12
- 12 http://bookmarks.yahoo.co.jp/k_aoyama3?orderby=ctime&b=59&sort=DESC

