2013-08-14 3 views
8

Предположим, что массив последователен, когда каждый успешный элемент имеет значение предыдущего элемента + 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; 
} 

Я пытаюсь определить, является ли покерная рука прямой.

+0

Возможный дубликат [убедитесь, что массив последователен в C#] (http://stackoverflow.com/questions/5413272/make-sure-array-is-sequential-in-c-sharp) – Gabe

+0

Как вы справляетесь с туз? Если его значение равно 1, вы не можете использовать этот метод для обнаружения прямой туза. – Gabe

+2

Ваш код прост и отлично работает –

ответ

8

Попробуйте это:

bool IsSequential(int[] array) 
    { 
     return array.Zip(array.Skip(1), (a, b) => (a + 1) == b).All(x => x); 
    } 
+1

Для этого требуется LINQ. – Gabe

+0

@AlexeiLevenkov: Если вы не используете 'Skip', вы просто сравниваете элементы с собой, что, конечно же, всегда будет равным. – Gabe

2

Я не знаю, если это действительно улучшение/лучше, но вы можете использовать диапазон.

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

Это возвращает true, если массив не содержит порядковый номер.

1

То же, что: make sure array is sequential in C#

Ответ есть:

, если вы уверены, что массив отсортирован и не имеет дубликатов, вы можете просто проверить:

array[array.Length - 1] == array[0] + array.Length - 1 
+0

Это неправильно, с этим вы не можете ничего знать о других элементах, чем в первую очередь. – Serge

+0

@Serge, поэтому указано: если вы уверены, что массив отсортирован и не имеет дубликатов. Если да - ответ правильный. Подумайте, почему! – sara

1
var result = Enumerable.Range(array[0], array[array.Length-1]).Except(array.ToList()); 
2

Использование Linq:

public static bool IsSequential(int[] a) 
    { 
     return Enumerable.Range(1, a.Length - 1).All(i => a[i] - 1 == a[i - 1]); 
    } 
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"); 
} 
0

сортировать массив, удалить N из вида (например, пар) с использованием различных() и если длина массива всегда == 5 Все, что вам нужно сделать, если ((array [4] - array [0]) == 4) return true.

Это становится более сложным, если его техасский холдем или если вам нужно учитывать как туз, так и туз с низким уровнем.