Czy istnieje sposób, aby z LINQ sprawdzić, czy lista liczb całkowitych jest "sekwencyjna" - tj. 1,2,3,4,5 lub 14,15,16,17 , 18?Sprawdź, czy lista liczb całkowitych zwiększa się o jeden
Odpowiedz
Można to zrobić poprzez Enumerable.Zip:
bool sequential = values.Zip(values.Skip(1), (a,b) => (a+1) == b).All(x => x);
Działa poprzez każdą parę wartości i sprawdzając, czy drugi jest 1 więcej niż w pierwszym, i powrotu wartości logicznych. Jeśli wszystkie pary pasują do kryteriów, wartości są sekwencyjne.
Biorąc pod uwagę, że jest to lista liczb całkowitych, można to zrobić nieco bardziej wydajnie przy użyciu:
bool sequential = values.Skip(1).Select((v,i) => v == (values[i]+1)).All(v => v);
to będzie działać tylko na sekwencji, które mogą być dostępne przez indeks. Zauważ, że używamy values[i]
, a nie values[i-1]
, ponieważ wywołanie Skip
skutecznie przesuwa indeksy.
bool isSequential = Enumerable.Range(values.Min(), values.Count())
.SequenceEqual(values);
Nie wiem, dlaczego nie została wybrana jako odpowiedź: jest genialnie prosta – user1830285
Jedną z opcji jest użycie Aggregate do powtórzenia sekwencji tylko jeden raz.
Należy zauważyć, że w przeciwieństwie do All
sugerowanej przez Reed Copsey Aggregate
nie może zatrzymać się w środku, gdy warunek nie ...
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;
hodowców wersja byłoby mieć iterator, który niesie poprzednią wartość wzdłuż lub specjalny kod, które Podziel iterator na "First and reszta", pozwalając na implementację rozwiązania Reeda z pojedynczą iteracją dla dowolnego przelicznika.
Dodano "ToList()", ponieważ pytanie dotyczyło listy, chcę kontynuować zabawę i Wersje hodowcy! –
+1 To działa - ale powoduje masę pamięci dla dużych list i nie może zwodzić na sukcesie ... Wciąż wolę jedną z moich opcji (moja druga, w szczególności, jest bardziej wydajna, jeśli wiem, że jest to lista
Jeśli już wiesz, że numery masz w swojej liście jest wyjątkowy, a także klasyfikowane, to najprostsza czek na sekwencyjnym tylko
lst[lst.Count - 1] - lst[0] == lst.Count - 1
Załóżmy conajmniej 1 element listy.
- 1. Czy zakres liczb całkowitych zawiera co najmniej jeden idealny kwadrat?
- 2. Lista ciągów do liczb całkowitych przy zachowaniu formatu w pytonie
- 3. Kodowanie/kompresji sekwencji powtarzających się liczb całkowitych
- 4. Jak bezpiecznie używać liczb całkowitych?
- 5. Określanie liczb parzystych/nieparzystych (liczb całkowitych)?
- 6. Java: grupowanie liczb całkowitych
- 7. Stream liczb całkowitych
- 8. Dzielenie liczb całkowitych
- 9. Python: podzielona lista liczb całkowitych w oparciu o krok między nimi
- 10. vim regex zwiększa wszystkie liczby o 1
- 11. python: Generowanie partycji liczb całkowitych
- 12. C: Reprezentacja dużych liczb całkowitych
- 13. Przekraczanie dwóch liczb całkowitych bitowych
- 14. Jak znaleźć grupę liczb całkowitych (N) wśród rekordów, która zawiera 6 liczb całkowitych
- 15. Przekazywanie liczb całkowitych o dowolnych rozmiarach od Prolog do C
- 16. Uzyskiwanie liczb losowych z listy liczb całkowitych
- 17. Podział liczb całkowitych w Javie
- 18. Reguły konwersji liczb całkowitych C++
- 19. Sprawdź, czy Lista obiektów zawiera obiekt o określonej wartości atrybutu
- 20. m liczb całkowitych brakujących w tablicy o rozmiarze n
- 21. Wstawianie przecinków do liczb całkowitych
- 22. Generowanie losowych liczb całkowitych w zakresie o rozkładzie prawdopodobieństwa
- 23. Efektywne pakowanie liczb całkowitych o dowolnej wielkości w Pythonie
- 24. Konwersja Java do liczb całkowitych
- 25. Podział liczb całkowitych zwraca 0
- 26. Porównanie liczb całkowitych dowolnych typów
- 27. Podział na seq liczb całkowitych
- 28. Czy zwiększa się zależność biblioteki APK?
- 29. Zaokrąglanie liczb całkowitych z parseInt w javascript
- 30. Jak podsumować tablicę liczb całkowitych w C#
@dtb Dzięki za naprawienie ... –
+1. Myślę, że można to również zrobić za pomocą Aggregate (po prostu zachowaj różnicę), aby uniknąć wielokrotnego powtarzania sekwencji ... Spróbuję napisać to później jako odpowiedź ... –
@AlexeiLevenkov Moja druga opcja tylko iteruje raz, ale bazuje na sekwencja będąca listą. Mogę zobaczyć, jak to zrobić za pomocą 'Aggregate', ale tylko jeśli sprawisz, że twoja lambda będzie miała nieprzyjemne efekty uboczne ... :( –