C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)

C#には LINQ というライブラリがあります。

LINQ を使えばコレクション(配列や List クラスなど)に対する処理を簡単に行う事が出来ます。

 

ここでは、LINQ を使って配列から最初の要素を取り出す方法について解説します。


LINQとは

LINQ は IEnumerable<T>インターフェースへの拡張メソッドとして作られています。

つまり、配列Listクラス、Dictionaryクラス、ObservableCollectionクラスなどのIEnumerable<T>インターフェースを実装するオブジェクトであればどれでも同じように使用する事ができます。

 

LINQをつかうには using で System.Linq を参照できるようにしておきましょう。

using System.Linq;

LINQは遅延実行される

なぜわざわざ配列の最初の要素を取り出すメソッドが用意されているのかと思うかもしれません。

LINQ では SelectWhere といった他のメソッドを組み合わせた利用が想定されています。

 

この為、戻り値が IEnumerable<T> となるSelect や Where などのメソッドはデータに対するアクションは行われず、メソッドはどのような処理をするかというコマンドだけを溜め込んでいるような状態となります。

 

LINQ は foreach 文や ToArray そして First といったメソッドを実行する時にデータが作成されます。

このような仕組みによって、複数のLINQメソッドと併用しても高速に結果を得られるようになっています。


配列の最初の要素を取り出す Firstメソッド

配列の最初の要素を取り出すのが First メソッドです。

LINQ の結果を得る場合は ToArrayメソッドや ToListメソッドで配列やListクラスを使う事が多いかもしれません。

 

しかし、Whereの条件によっては結果が1つと分かっている場合もあります。

このような時は、Firstメソッドを使うと良いでしょう。

 

以下の例では指定のIDを持つ要素を取り出しています。

            TestItem[] testArray = new TestItem[5];
            testArray[0] = new TestItem() { ID = "00001", Name = "Taro" };
            testArray[1] = new TestItem() { ID = "00002", Name = "Jiro" };
            testArray[2] = new TestItem() { ID = "00003", Name = "Saburo" };
            testArray[3] = new TestItem() { ID = "00004", Name = "Shiro" };
            testArray[4] = new TestItem() { ID = "00005", Name = "Goro" };

            try
            {
                TestItem item = testArray.Where(o => o.ID == "00002").First();
            }
            catch (InvalidOperationException e)
            {
            }

 

Whereで一致する要素が無いなどで、先頭要素が無い場合はInvalidOperationExceptionという例外が発生するので注意しましょう。


要素が無ければ既定値を返す FirstOrDefaultメソッド

Firstメソッドでは返すべき要素が無い場合に例外が発生します。

その都度 try ~ catch で例外を処理するのが面倒な場合は FirstOrDefault メソッドがあります。

  

FirstOrDefault メソッドなら返すべき要素が無い場合には既定値を返してくれます。

既定値は以下のように定義されています。

  • 参照型 ・・・ null
  • 整数型 ・・・ 0 (ゼロ)
  • 実数型 ・・・ 0 (ゼロ)
  • bool型 ・・・ false
  • char型 ・・・ '\0' (U+0000)
            TestItem[] testArray = new TestItem[5];
            testArray[0] = new TestItem() { ID = "00001", Name = "Taro" };
            testArray[1] = new TestItem() { ID = "00002", Name = "Jiro" };
            testArray[2] = new TestItem() { ID = "00003", Name = "Saburo" };
            testArray[3] = new TestItem() { ID = "00004", Name = "Shiro" };
            testArray[4] = new TestItem() { ID = "00005", Name = "Goro" };

            TestItem item = testArray.Where(o => o.ID == "01002").FirstOrDefault();

 

関連記事