15

假设当每个成功的元素都具有前一个元素的值时,数组是连续的+ 1。假设我有一个数字数组,例如{5,6,7,8}(顺序)或{1,2,5}(非顺序)。

有没有一种很好的功能方法来检查数组是否是顺序的?我可以使用以下代码来做到这一点:

bool IsSequential(int[] array)
{
    for (int i = 1; i < array.Length; i++)
       if (array[i] != array[i - 1] + 1)
            return false;
    return true;
}

我试图确定一手牌是否是顺子。

4

7 回答 7

19

试试这个:

    bool IsSequential(int[] array)
    {
        return array.Zip(array.Skip(1), (a, b) => (a + 1) == b).All(x => x);
    }
于 2013-08-14T06:55:42.543 回答
5

我不知道这是否真的是一种改进/更好,但你可以使用 Range。

ENumerable.Range(0, myArray.Length).Any(i => myArray[i] != myArray[0] + i)

如果数组不包含序号,则返回 true。

于 2013-08-14T06:56:50.147 回答
2

使用 Linq:

    public static bool IsSequential(int[] a)
    {
        return Enumerable.Range(1, a.Length - 1).All(i => a[i] - 1 == a[i - 1]);
    }
于 2013-08-14T07:02:10.307 回答
2

对于所有顺序的、非顺序的数据,这应该可以解决问题。带有样本输入的完整示例。经过测试并且工作正常

var list = new List<int>(new[] { 7, 6, 5, 4, 3,9});
int minValue = list.Min();
int maxValue = list.Count;
List<int> test =  Enumerable.Range(minValue, maxValue).ToList();
var result = Enumerable.Range(minValue, maxValue).Except(list);
if (result.ToList().Count == 0)
{
  Console.WriteLine("numbers are in sequence");
}
else
{               
   Console.WriteLine("Numbers are not in sequence");
 }
于 2013-08-14T07:02:42.113 回答
1

等同于:确保数组在 C# 中是连续的

那里回答:

如果您确定数组已排序并且没有重复,您可以检查:

array[array.Length - 1] == array[0] + array.Length - 1
于 2013-08-14T06:57:41.787 回答
1
var result = Enumerable.Range(array[0], array[array.Length-1]).Except(array.ToList());
于 2013-08-14T06:58:02.527 回答
0

首先对数组进行排序,使用 distinct() 删除一种类型的 N(例如对),如果数组长度始终 == 到 5 您需要做的就是 if((array[4] - array[0]) == 4) 返回真。

如果它是德州扑克,或者如果你需要同时考虑 ace 高和 ace 低顺子,它会变得更加复杂。

于 2017-09-27T12:53:35.493 回答