LoginSignup
1
5

More than 1 year has passed since last update.

C#でメソッド構文を書いてみる

Last updated at Posted at 2023-02-01

1. はじめに

  • C#のLINQでメソッド構文を使いたい

2. 数値型

2.1. Where

  • 抽出した条件に合致する値を取得する
var nums = new List<int> {1, 2, 3, 4, 5, 6};
var result = nums.Where(x=>x ?=5);
Debug.Print("result=" + string.Join(",", result));

2.2. Average

  • 平均値を取得する
var result = nums.Average();

2.3. Max

  • 最大値を取得する
var result = nums.Max();

2.4. Min

  • 最小値を取得する
var result = nums.Min();

2.5. Sum

  • 合計値を集計する
var result = nums.Sum();

3. 文字型

3.1. Average, Max, Min, Sum

  • 文字列の長さの平均を集計する
  • Max, Min, Sumも同じように使用できる
string[] values = {"A","BB","CCC","DDDD","EEEE"};
var result = values.Average(x=> x.Length);

3.2. OfType

  • Tの型の値のみを取得する
Object[] objects = {1,2,"A","BB","CCC"};
// int型の値のみを取得する
var result = objects.OfType<int>();

4. カスタムクラス型

4.1. Where

  • 抽出した条件に合致する値を取得する
// 商品コード、商品名、価格のカスタムクラス
var products = new List<Product>();
products.Add(new Product(10,"name",100));
products.Add(new Product(20,"name",200));
// 価格が200のもの抽出する
var results = products.Where(p=> p.Price ==200);
foreach(var val in results)
{
    Debug.print($"results: id={val.ProductId} name={val.ProductName} price={val.Price}");
}

4.2. Select

  • 必要な項目のみを取得する
  • 複数項目の場合、new{内に項目を併記する
// 単項目の場合
var results = products.Where(p=> p.Price ==200).Select(p=>p.ProductId);

// 単項目の場合
var results = products.Where(p=> p.Price ==200).Select(p=> new{p.ProductId, p.ProductName});

5. リスト型

5.1. ForEach

  • 取得したものに対してActionを記述できる
// デバッグ出力するケース
var results = products.Where(p=> p.Price ==200).ToList();
results.ForEach(p=>Debug.Print(p.ProductName));

// リストのDTOへ追加するケース
var dtos = new List<ProductDto>();
results.ForEach(p=>dtos.Add(new ProductDto(x)));

5.2. ToArray, ToList, ConvertAll

  • ToArray: 配列に変換する
  • ToList: リストに変換する
  • ConvertAll: 任意の型に変換する
// 配列に変換する
var results = products.Where(p=> p.Price ==200).ToArray();
// リストに変換する
var results = products.Where(p=> p.Price ==200).ToList();
// 任意の型に変換する1
var results = products.Where(p=> p.Price ==200).ConvertAll((x=> new ProductDto(x)));
// 任意の型に変換する2
var nums = new List<int>{1,2,3};
var results = nums.ConverAll(x=> x.ToString());

5.3. OrderBy

  • 昇順で並び替える
// 昇順
var results = products.OrderBy(x=>x.Price);

5.4. OrderByDescending

  • 昇順で並び替える
// 降順
var results = products.OrderByDescending(x=>x.Price);

5.5. ThenBy

  • OrderByで複数条件の場合に使用する
var results = products.OrderByDescending(x=>x.Price).ThenBy(x=>x.ProductId);

5.6. GroupBy

  • グループ化することができる
// 単項目の場合
var results = products.GroupBy(x=>x.Price);
// 複数項目の場合
var results = products.GroupBy(x=>new{x.ProductId,x.Price});

6. Enumerableクラス

6.1. Repeat

  • 指定回数で繰り返し返却する
/// results = 5,5,5,5,5,5,5,5,5,5;
var results = Enumerable.Repeat(5,10);

6.2. Range

  • 指定した範囲で値を返却する
/// results = 34,35,36
var results = Enumerable.Range(34,3);

6.3. SequenceEqual

  • 値が同じかどうかを判定する
// 配列の場合
string[] x = new string[] {"A","B"};
string[] y = new string[] {"A","B"};
Debug.print(x.SequenceEqual(y)); // true
Debug.print(x==y));	// false

// カスタムクラスの場合
var x = new List<Product>();
products.Add(new Product(10,"name",100));
products.Add(new Product(20,"name",200));
var y = new List<Product>();
products.Add(new Product(10,"name",100));
products.Add(new Product(20,"name",200));
Debug.print(x.SequenceEqual(y)); // false (Equalsメソッドをoverrideする必要あり)
  • カスタムクラスのEqualsメソッドをオーバーライドするサンプル
public override bool Equals(object obj)
{
    // パラメータがnullの場合
    if(obj == null){
        return false
    }
    
    // 型変換ができなかった場合
    var product = obj as product;
    if(product == null){
        return false;
    }
    
    // 商品IDが違う場合
    if(product.ProductId =! ProductId)
        return false;
	}

	// 商品名が違う場合
    if(product.ProductName =! ProductName)
        return false;
	}

	// 価格が違う場合
    if(product.Price =! Price)
        return false;
	}

	// 値が同じ場合
    return true;
}

6.4. Distinct

  • 値を重複を削除する
var nums[] = new int[] {1,1,2,2};
// results: 1,2
var results = nums.Distinct();

6.5. Intersect

  • 重複する値を取得する
var x[] = new int[] {1,2,3};
var y[] = new int[] {3,4,5};

// results: 3
var results = x.Intersect(y);

6.6. Union

  • どちらかにある値を取得する
var x[] = new int[] {1,2,3};
var y[] = new int[] {3,4,5};

// results: 1,2,3,4,5
var results = x.Union(y);

6.7. Except

  • 片方のみにある値を取得する
var x[] = new int[] {1,2,3};
var y[] = new int[] {3,4,5};

// results: 1,2
var results = x.Except(y);
// results: 4,5
var results = y.Except(x);

6.8. Skip

  • 指定した回数スキップした後の値を取得する
var nums[] = new int[] {1,2,3,4,5};

// results: 4,5
var results = x.Skip(3);

6.9. Take

  • 先頭から指定した回数の値を取得する
var nums[] = new int[] {1,2,3,4,5};

// results: 1,2,3
var results = x.Take(3);

6.10. SkipWhile

  • 指定した条件までスキップした後の値を取得する
var nums[] = new int[] {1,2,3,4,5,4,3,2,1};

// results: 3,4,5,4,3,2,1
var results = x.SkipWhile(x=> x <3);

6.11. TakeWhile

  • 指定した条件までの値を取得する
var nums[] = new int[] {1,2,3,4,5,4,3,2,1};

// results: 1,2,3,4
var results = x.TakeWhile(x=> x <5);

6.12. All

  • すべて指定した条件に合致しているかを判定する
var nums[] = new int[] {1,2,3,4,5,4,3,2,1};

// results: true
var result = x.All(x=> x>1);
// results: false
var result = x.All(x=> x>2);

6.12. Any

  • 指定した条件にいずれかに合致しているかを判定する
var nums[] = new int[] {1,2,3,4,5,4,3,2,1};

// results: true
var result = x.All(x=> x==1);
// results: false
var result = x.All(x=> x==6);

7. 参考文献

1
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
5