Symfoware

Symfowareについての考察blog

C# LINQ の使い方(Select, Where, OrderBy, OrderByDescending, Aggregate)

C# LINQの使い方を調べてみます。
コンパイルと実行はDebian 8 + mono 4.6で行っています。
Debian 8(jessie)にapt-getでmonoをインストール


Select



Selectなので、データの絞り込みのように見えますが実際は値を変換する感じです。
個々の値に関数を適用するイテレーターを返します。


  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         int[] src = new int[]{1, 2, 3, 4, 5};
  9.         
  10.         // 値を二乗
  11.         IEnumerable<int> it = src.Select(item => item * item);
  12.         
  13.         foreach(int item in it) {
  14.             Console.WriteLine(item);
  15.         }
  16.         
  17.     }
  18. }



実行結果


1
4
9
16
25






Where



Whereで条件に合致する値のみ取得できます。


  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         int[] src = new int[]{1, 2, 3, 4, 5};
  9.         
  10.         // 偶数のみ
  11.         IEnumerable<int> it = src.Where(item => item % 2 == 0);
  12.         
  13.         foreach(int item in it) {
  14.             Console.WriteLine(item);
  15.         }
  16.         
  17.     }
  18. }



実行結果


2
4






OrderBy, OrderByDescending



並び替えです。
OrderBy:昇順
OrderByDescending:降順


  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         var src = new [] {
  9.             new { x = 3, y = 13 },
  10.             new { x = 1, y = 11 },
  11.             new { x = 5, y = 15 },
  12.             new { x = 2, y = 12 },
  13.             new { x = 4, y = 14 },
  14.             
  15.         };
  16.         
  17.         // xで並び替え
  18.         var it = src.OrderBy(elem => elem.x);
  19.         
  20.         foreach(var item in it) {
  21.             Console.WriteLine(item);
  22.         }
  23.         
  24.     }
  25. }



実行結果


{ x = 1, y = 11 }
{ x = 2, y = 12 }
{ x = 3, y = 13 }
{ x = 4, y = 14 }
{ x = 5, y = 15 }





  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         var src = new [] {
  9.             new { x = 3, y = 13 },
  10.             new { x = 1, y = 11 },
  11.             new { x = 5, y = 15 },
  12.             new { x = 2, y = 12 },
  13.             new { x = 4, y = 14 },
  14.             
  15.         };
  16.         
  17.         // xで並び替え
  18.         var it = src.OrderByDescending(elem => elem.x);
  19.         
  20.         foreach(var item in it) {
  21.             Console.WriteLine(item);
  22.         }
  23.         
  24.     }
  25. }



実行結果


{ x = 5, y = 15 }
{ x = 4, y = 14 }
{ x = 3, y = 13 }
{ x = 2, y = 12 }
{ x = 1, y = 11 }






Aggregate



Pythonでいうreduceです。
関数を適用し、値を1つにまとめます。


  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         var src = new [] {
  9.             new { x = 3, y = 13 },
  10.             new { x = 1, y = 11 },
  11.             new { x = 5, y = 15 },
  12.             new { x = 2, y = 12 },
  13.             new { x = 4, y = 14 },
  14.             
  15.         };
  16.         
  17.         // xとyの値を合算
  18.         int total = src.Aggregate(0, (sum, elem) => sum + elem.x + elem.y);
  19.         
  20.         Console.WriteLine(total);
  21.         
  22.     }
  23. }



実行結果


80





結果を配列、リストで取得



結果をイテレータではなく、配列やリストで取得したい場合は、
ToArrayやToListを使うと便利です。

ToArrayの例


  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         int[] src = new int[] { 1, 2, 3, 4, 5};
  9.         
  10.         // 結果を配列で取得
  11.         int[] ret = src.Where(item => item % 2 == 0).ToArray<int>();
  12.         
  13.         foreach(int v in ret) {
  14.             Console.WriteLine(v);
  15.         }
  16.     }
  17. }




実行結果


2
4





ToListの例


  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         int[] src = new int[] { 1, 2, 3, 4, 5};
  9.         
  10.         // 結果をリストで取得
  11.         List<int> ret = src.Where(item => item % 2 == 1).ToList<int>();
  12.         
  13.         foreach(int v in ret) {
  14.             Console.WriteLine(v);
  15.         }
  16.     }
  17. }



実行結果


1
3
5






辞書型で結果を取得



ToDictionaryで結果を辞書型に変換できます。


  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. public class Sample {
  5.     
  6.     static public void Main () {
  7.         
  8.         var src = new [] {
  9.             new { x = 3, y = 13 },
  10.             new { x = 1, y = 11 },
  11.             new { x = 5, y = 15 },
  12.             new { x = 2, y = 12 },
  13.             new { x = 4, y = 14 },
  14.             
  15.         };
  16.         
  17.         // 結果を辞書型で取得
  18.         var ret = src.Where(item => item.x % 2 == 1).ToDictionary(item => item.x);
  19.         
  20.         foreach(var v in ret) {
  21.             Console.WriteLine(v);
  22.         }
  23.     }
  24. }



実行結果


[3, { x = 3, y = 13 }]
[1, { x = 1, y = 11 }]
[5, { x = 5, y = 15 }]




これは便利。

関連記事

テーマ:プログラミング - ジャンル:コンピュータ

  1. 2016/10/03(月) 22:38:18|
  2. 備忘録
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Debian 8(jessie) + C#(Mono)でSQL Server 2016に接続する | ホーム | C# LINQ の使い方(Count, Take, Skip, First, Last, Max, Min, Contains, All, Any, Distinct, Sum)>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://symfoware.blog68.fc2.com/tb.php/1928-3d55189a
この記事にトラックバックする(FC2ブログユーザー)