C'è un modo, con LINQ, per verificare se un elenco di numeri interi è "sequenziale" - cioè 1,2,3,4,5 o 14,15,16,17 , 18?Controlla se un elenco di interi aumenta di uno
risposta
Si potrebbe fare questo attraverso Enumerable.Zip:
bool sequential = values.Zip(values.Skip(1), (a,b) => (a+1) == b).All(x => x);
Questo funziona prendendo ogni coppia di valori, e controllare per vedere se il secondo è 1 più del primo, e il ritorno booleani. Se tutte le coppie soddisfano i criteri, i valori sono sequenziali.
Dato che questa è una lista di interi, si può fare questo un po 'più efficiente utilizzando:
bool sequential = values.Skip(1).Select((v,i) => v == (values[i]+1)).All(v => v);
questo funziona solo su sequenze a cui si accede tramite un indice. Si noti che utilizziamo values[i]
, non values[i-1]
, poiché la chiamata Skip
sposta effettivamente gli indici.
bool isSequential = Enumerable.Range(values.Min(), values.Count())
.SequenceEqual(values);
Non so perché questa non è stata selezionata come risposta: è straordinariamente semplice – user1830285
Un'altra opzione è quella di utilizzare Aggregate per iterare la sequenza una sola volta.
Si noti che diversamente All
suggerito da Reed Copsey Aggregate
non si può fermare a metà quando la condizione non riesce ...
var s = new int[] {3,4,5,6}.ToList();
var isSequential = s.Aggregate
(
new {PrevValue = 0, isFirst = true, Success = true} ,
(acc, current) =>
new {
PrevValue = current,
isFirst = false,
Success = acc.Success && (acc.isFirst || (acc.PrevValue == current - 1))
}
)
.Success;
Fancier versione sarebbe quella di avere iteratore che porta valore precedente lungo o un codice speciale che avrebbe split iterator su "First and the rest" che consente di implementare la soluzione di Reed con un'unica iterazione per ogni enumerabile.
Aggiunto 'ToList()' dato che la domanda riguardava una lista. versioni più fantasiose! –
+1 Funziona - ma sforna molta memoria per le liste di grandi dimensioni e non può causare un cortocircuito sul successo ... Preferisco comunque entrambe le mie opzioni (il mio secondo, in particolare, è più efficiente se sapere che è una lista
Se sai già che i numeri che avete nella vostra lista è unico, e anche risolto, quindi il controllo più semplice per sequenziale è solo
lst[lst.Count - 1] - lst[0] == lst.Count - 1
Si supponga atleast 1 elemento della lista.
- 1. Controlla variabile se è in un elenco
- 2. Controlla se qualcosa è un elenco
- 3. Haskell: Controlla se Int è in un elenco di Int
- 4. Controlla se l'oggetto è un elenco di lista in python?
- 5. Converti un elenco di elenchi in un elenco di interi
- 6. Numpy: controlla se l'array float contiene numeri interi
- 7. Controlla se un elenco contiene già un articolo o no?
- 8. controlla se un singolo carattere è uno spazio bianco?
- 9. Scala controlla se l'elemento è presente in un elenco
- 10. Controlla se l'elemento è nella lista (contiene)
- 11. Controlla se esiste un thread maneggiato
- 12. Conversione sottoinsieme di stringhe di numeri interi in un elenco
- 13. Convertire un numero in un elenco di numeri interi
- 14. Controlla se l'elenco contiene un tipo?
- 15. NSPredicate controlla NSArray se l'oggetto ha uno dei vari ID
- 16. Come generare un elenco di numeri interi casuali ascendenti
- 17. jQuery controlla se uno qualsiasi degli ingressi selezionati è vuoto
- 18. Controlla se un pacchetto è installato
- 19. Controlla se la stringa è solo uno spazio bianco?
- 20. controlla se una stringa si trova in un elenco di stringhe da 2 GB in python
- 21. Rilevamento interi consecutivi in un elenco
- 22. posizionare uno 0 davanti ai numeri in un elenco se sono meno di dieci (in python)
- 23. Come sommare un elenco di interi con flussi java?
- 24. Filtro max 20 valori da un elenco di numeri interi
- 25. Controlla se la finestra è un MessageBox
- 26. Come si controlla uno scalare in R?
- 27. controlla se esiste già un numero in un elenco in python
- 28. Controlla se PyObject è None
- 29. Express, controlla se esiste un modello
- 30. C#: controlla se un file non è bloccato e scrivibile
@dtb Grazie per averlo risolto ... –
+1. Penso che si possa fare anche con Aggregate (mantieni la differenza) per evitare di ripetere la sequenza più volte ... Proverò a scriverlo più tardi come risposta ... –
@AlexeiLevenkov La mia seconda opzione esegue solo una volta una iterazione, ma dipende sequenza è una lista. Posso vedere come farlo con 'Aggregate', ma solo se fai il tuo lambda avere effetti collaterali sgradevoli ... :( –