LINQ で歯抜けインデックスと重複データ

LINQ って便利ですよね。書きやすいし、従来のコードよりも簡潔に記述できるような感触があります。今回はその LINQ で書いてみたコード片を共有したいと思います。

歯抜け番号の最小値を得る

以下のような列があって、その中で最小の歯抜け番号値を得たいとします。配列のインデックスに使いたいという要望があったりして、0以上の整数値が返ってきて欲しいという前提条件です。

var temp = new int[]
{
  1,2,3,5,6,8,10,
};

これを求めるための LINQ は以下のように書くことができました。もっと良い方法があるかもしれませんが。

var idx = temp
  .Where( x => !temp.Contains(x+1) )
  .Select( x => x+1 )
  .Min();

ただし、null を許容しない型の場合、空のシーケンスが生成されたときに Min の箇所で例外が発生してしまうので、何らかの対処が必要となります.この場合だと int? 型に変更するとか. temp が空ではないか事前にチェックするとか.

SQL の場合にはこのインデックス値を求めるための情報が色々とあるようですが、 LINQ ではちょっと見つかる率が低いようだったので書いてみました。

重複チェック

重複を排除してユニーク化するための方法は LINQ で Distinct メソッドが提供されていて簡単なのですが、逆に重複があるかをチェックしたいときには工夫が必要になります。

var isDup = temp
  .GroupBy( x => x )
  .Where( x => x.Count() > 1 )
  .Any()

他にも方法はあると思いますが、上記の方法であれば Any を外せば重複している項目も分かりますし、利用する場面は広いかなと思います。

プログラミング
すらりんをフォローする
すらりん日記

コメント

タイトルとURLをコピーしました