2013-08-14 10 views
8

Załóżmy, że tablica jest sekwencyjna, gdy każdy pomyślny element ma wartość poprzedniego elementu + 1. Załóżmy, że mam tablicę liczb, takich jak {5,6,7,8} (sekwencyjna) lub {1,2,5} (nie sekwencyjnych).Funkcjonalny sposób sprawdzania, czy tablica liczb jest sekwencyjna

Czy istnieje ładny funkcjonalny sposób sprawdzenia, czy tablica jest sekwencyjna? Mogę to zrobić za pomocą następującego kodu:

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

Próbuję ustalić, czy układ kart jest prosty.

+0

możliwy duplikat [upewnij się, że tablica jest sekwencyjna w języku C#] (http://stackoverflow.com/questions/5413272/make-sure-array-is-sequential-in-c-sharp) – Gabe

+0

Jak sobie radzisz z as? Jeśli jego wartość wynosi 1, nie możesz użyć tej metody do wykrycia prostej prostej asa. – Gabe

+2

Twój kod jest prosty i działa doskonale –

Odpowiedz

8

Spróbuj tego:

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

Wymaga LINQ. – Gabe

+0

@AlexeiLevenkov: Jeśli nie używasz 'Pomiń', po prostu porównujesz elementy ze sobą, które oczywiście zawsze będą równe. – Gabe

2

Nie wiem, czy to naprawdę poprawa/ładniejsze, ale można użyć Range.

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

Zwraca prawdę, jeśli tablica nie zawiera numeru kolejnego.

1

samo jak: make sure array is sequential in C#

Answer tam:

jeśli jesteś pewien, że tablica jest posortowana i nie ma duplikatów, można po prostu sprawdzić:

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

To źle, z tym nie możesz nic wiedzieć o innych elementach niż pierwszy i ostatni. – Serge

+0

@Serge, dlatego określono: jeśli masz pewność, że tablica jest posortowana i nie ma duplikatów. Jeśli tak, odpowiedź jest prawidłowa. Zastanów się, dlaczego! – sara

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

Korzystanie z Linq:

public static bool IsSequential(int[] a) 
    { 
     return Enumerable.Range(1, a.Length - 1).All(i => a[i] - 1 == a[i - 1]); 
    } 
2

To powinno wystarczyć, dla wszystkich kolejnych, niesekwencyjnych danych. Kompletny przykład z wprowadzeniem próbki. Przetestowane i działa dobrze

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

Sortuj tablicę, usunąć N w swoim rodzaju (np pary) za pomocą wyraźny() i jeśli długość tablicy jest zawsze == do 5 Wszystko, co musisz zrobić, to if ((array [4] - array [0]) == 4) Zwraca true.

To staje się bardziej skomplikowane, jeśli jego texas holdem lub jeśli chcesz uwzględnić zarówno asa wysokiego, jak i asa niskiego strita.

Powiązane problemy