2013-08-14 11 views
8

Diciamo che un array è sequenziale quando ogni elemento di successo ha il valore dell'elemento precedente + 1. Supponiamo che io abbia una matrice di numeri come {5,6,7,8} (sequenziale) o {1,2,5} (non sequenziale).Modo funzionale per verificare se la matrice di numeri è sequenziale

C'è un modo funzionale per verificare se l'array è sequenziale? Posso farlo con il seguente codice:

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

Sto cercando di determinare se una mano di poker è diritta.

+0

possibile duplicato di [assicurarsi che la matrice sia sequenziale in C#] (http://stackoverflow.com/questions/5413272/make-sure-array-is-sequential-in-c-sharp) – Gabe

+0

Come si gestisce l'asso? Se il suo valore è 1, non è possibile utilizzare questo metodo per rilevare una scala ace-alta. – Gabe

+2

Il tuo codice è semplice e funziona perfettamente –

risposta

8

provare questo:

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

Ciò richiede LINQ. – Gabe

+0

@AlexeiLevenkov: Se non usi "Salta", stai solo confrontando gli elementi con se stessi, che ovviamente saranno sempre uguali. – Gabe

2

Non so se è davvero un miglioramento/più bello, ma si potrebbe usare Range.

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

Restituisce true se l'array non contiene il numero sequenziale.

1

Uguale: make sure array is sequential in C#

risposta c'è:

se si è sicuri che l'array è ordinato e non ha duplicati, si può solo controllare:

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

Questo è sbagliato, con questo non puoi sapere nulla degli altri elementi rispetto al primo e all'ultimo. – Serge

+0

@Serge è per questo che specificato: se sei sicuro che l'array è ordinato e non ha duplicati. Se è così - la risposta è corretta. Pensa perché! – sara

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

Utilizzo di Linq:

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

Questo dovrebbe fare il trucco, per tutti i dati sequenziali, non sequenziali. Un esempio completo con input di esempio. testato e funziona bene

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

Innanzitutto ordina l'array, rimuovere N dei tipi (ad esempio coppie) utilizzando distinti() e se la lunghezza della matrice è sempre == a 5 Basta fare è if ((array [4] - array [0]) == 4) restituisce true.

Diventa più complicato se il suo Texas Holdem o se è necessario tenere conto sia di un asso alto e asso basso rettilineo.