未分類

C# LINQ - 配列処理を行う

準備

(なし)

デザイン

1. フォーム (Form1) にボタン (button1) を配置します。
2. フォーム (Form1) にリストボックス (listBox1) を配置します。

サンプルコード (C#)

private void button1_Click(object sender, EventArgs e)
{
  // パターン-1 : 従来の方法
  string[] sData = { "A", "ABC", "XYZ", "AAA", "AB" };
  string[] query = new string[0];
  
  foreach (var item in sData)
  {
    if (((string)item).StartsWith("AB"))
    {
      Array.Resize(ref query, query.Length + 1);
      query[query.Length - 1] = item;
    }
  }
  
  foreach (string item in query)
  {
    listBox1.Items.Add(item);
  }
}

private void button2_Click(object sender, EventArgs e)
{
  // パターン-2 : LINQ を使った方法
  string[] sData = { "A", "ABC", "XYZ", "AAA", "AB" };
  var query = from item in sData
  where ((string)item).StartsWith("AB")
  select item;
  
  foreach (string item in query)
  {
    listBox1.Items.Add(item);
  }
}

private void button3_Click(object sender, EventArgs e)
{
  // パターン-3 : メソッド形式の LINQ を使った方法 + Delegate
  string[] sData = { "A", "ABC", "XYZ", "AAA", "AB" };
  var query = sData.Where(delegate(string s)
  {
    if (((string)s).StartsWith("AB")) return true; else return false;
  });
  
  foreach (string item in query)
  {
    listBox1.Items.Add(item);
  }
}

private void button4_Click(object sender, EventArgs e)
{
  // パターン-4 : メソッド形式の LINQ を使った方法 + ラムダ式
  string[] sData = { "A", "ABC", "XYZ", "AAA", "AB" };
  var query = sData.Where(s => ((string)s).StartsWith("AB"));
  
  foreach (string item in query)
  {
    listBox1.Items.Add(item);
  }  
}

解説

文字列配列から条件に合致した項目だけを抽出する処理を行います。

1. パターン-1 は、従来の方法で記述しています。条件に合致する項目を別の配列に一つ一つコピーしています。

2. パターン-2 は、SQL 形式の LINQ を使って、条件に合致する項目を抽出しています。SQL 形式なので、見やすい書き方です。パターン-1 に比べ項目の抽出にループを使っていないことが特徴です。

3. パターン-3 は、メソッド形式の LINQ を使って、条件に合致する項目を抽出しています。条件を判断する部分は匿名メソッドを使っており、やや分かりづらい形式になっています。

4. パターン-4 は、パターン-3 の匿名メソッド部分をラムダ式に変更して、見やすくなっています。

パターン-1,2,3,4 の順に文法的に進化しています。匿名メソッドはラムダ式によって置き換えられますので、パターン-3 は事実上使われないと思われます。後は、SQL 形式の LINQ かメソッド形式の LINQ を使うかの判断だと思います。SQL 形式は、メソッド形式よりも長い式になりますが、見やすさの点では評価できます。

結果

動作確認環境

Visual Studio 2015 Professional (C# 6.0)

-未分類