はじめに
本記事はリストが連番か(欠番あり)どうかを判定するC#のコードを考えたので私が備忘録的に残した記事です。
たとえばこんなリストであれば連番(欠番あり)だと判定します。
{1, 2, 4, 5, 6}
たとえばこんなリストであれば連番(欠番あり)だと判定しません。
{1, 2, 3, 4, 5}
もしよろしければお読みになった方のお役に立てたら嬉しいです。もともとは連番かどうか調べる記事を書いてたのでよかったらこっちもどうぞ。
追記:
こちらの記事でいただいたコメントから、リストのサイズが0の時の判定結果はどうするのかという定義が曖昧でしたので、今回は「リストのサイズが0ならば連番だと判定しない」ということにしました。
処理内容とソースコード
処理内容
どんな処理手順で判定を行うかというアイデアについて書きます。
- 判定対象のリストが昇順にソートされているか調べる
- リスト内で重複した要素を削除したリストの長さと元のリストの長さが等しいか調べる
- 判定対象のリストの最大値と最小値の差が、判定対象のリストの長さ + 欠番している要素数 - 1と等しいか調べる
- 1. と2. と3. の真偽値がいずれも真であれば連番(欠番あり)だと判定する
- 上記以外の場合に連番(欠番あり)でないと判定する
ソースコード
Main.cs
using System;
using System.Linq;
using System.Collections;
using System.Collections.Generic;
public class Main {
/// <summary>
/// 指定されたリストが連番か(欠番あり)どうかを判定します。
/// リストのサイズが0だとFalseと判定します。
/// </summary>
/// <param name="intList">判定対象のリスト</param>
/// <param name="missingCount">欠番している要素数</param>
/// <returns>連番かどうかの真偽値</returns>
public static bool isSequentialWithMissingInMid (List<int> intList, int missingCount) {
return intList.Count() > 0
&& intList.OrderBy(element => element).SequenceEqual(intList)
&& intList.Distinct().Count() == intList.Count()
&& intList.Max() == intList.Min() + intList.Count() + missingCount - 1
;
}
}
おわりに
ポーカーゲームを作っていた運びで標題の処理を書くに至りました。よかったらお役立てたらと思います。