C#には LINQ というライブラリがあります。
LINQ を使えばコレクション(配列や List クラスなど)に対する処理を簡単に行う事が出来ます。
ここでは、LINQ を使って配列から最初の要素を取り出す方法について解説します。
LINQとは
LINQ は IEnumerable<T>インターフェースへの拡張メソッドとして作られています。
つまり、配列、Listクラス、Dictionaryクラス、ObservableCollectionクラスなどのIEnumerable<T>インターフェースを実装するオブジェクトであればどれでも同じように使用する事ができます。
LINQをつかうには using で System.Linq を参照できるようにしておきましょう。
using System.Linq;
LINQは遅延実行される
なぜわざわざ配列の最初の要素を取り出すメソッドが用意されているのかと思うかもしれません。
LINQ では Select や Where といった他のメソッドを組み合わせた利用が想定されています。
この為、戻り値が 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();
関連記事
- C#の値型と参照型の違い
- C#のコンストラクタでオーバーロード
- C#のコンストラクタの継承
- C#のジェネリックを使おう
- C#のデリゲート (delegate) って何?
- C#のデリゲートお手軽にする匿名メソッド
- C#のラムダ式【=>】って何?
- C#で基底クラスのメソッドを置き換えるオーバーライド
- C#でキャストとas演算子を使いこなす
- C#で型を判別するtypeofとis演算子
- C#の値型でもnullを扱えるようにするNullable
- C#のリソース解放にはIDisposableとusingを使おう
- C#のStringとstring、Int32とint 違いは・・・ない!
- C#でasync/awaitを使った非同期処理
- C#で文字列を指定の区切り文字で分割
- C#のstring.Formatで桁数や書式を指定する
- C#の配列やListをソートする
- C#の配列やListを検索する (Find,FindAll,FindIndex)
- C#の配列やListを高速に検索する (BinarySearch)
- C#の配列の中に指定の要素が存在するかを調べる(LINQ Contains)
- C#の配列の中に条件を満たす要素が存在するかを調べる(LINQ Any)
- C#の配列から条件に合う要素を抽出する(LINQ Where)
- C#の配列で要素毎の処理結果を得る(LINQ Select)
- C#の配列を並び替える(LINQ OrderBy,ThenBy)
- C#の配列をグループ毎に処理する(LINQ GroupBy)
- C#の配列を内部結合(INNER JOIN)する(LINQ Join)
- C#の配列から最初の要素を取り出す(LINQ First,FirstOrDefault)
- C#の配列の重複要素を削除する(LINQ Distinct)
- C#でフォルダ内のファイル名一覧を取得する
- C#でテキストファイルを読み込む
- C#でテキストファイルに書き込む
- C#でバイナリファイルを読み込む
- C#でバイナリファイルに書き込む
コメントをお書きください