Có cách nào, với LINQ không, để kiểm tra xem danh sách các số nguyên có "tuần tự" hay không - tức là 1,2,3,4,5 hoặc 14,15,16,17 , 18?Kiểm tra xem danh sách các số nguyên có tăng thêm một số
Trả lời
Bạn có thể làm điều này thông qua Enumerable.Zip:
bool sequential = values.Zip(values.Skip(1), (a,b) => (a+1) == b).All(x => x);
này hoạt động bằng cách lấy mỗi cặp giá trị, và kiểm tra để xem nếu thứ hai là 1 hơn là người đầu tiên, và trở về boolean. Nếu tất cả các cặp phù hợp với tiêu chí, các giá trị là tuần tự.
Cho rằng đây là một danh sách của số nguyên, bạn có thể làm điều này một chút hiệu quả hơn sử dụng:
bool sequential = values.Skip(1).Select((v,i) => v == (values[i]+1)).All(v => v);
này sẽ chỉ làm việc trên các chuỗi có thể được truy cập bởi chỉ số. Lưu ý rằng chúng tôi sử dụng values[i]
, không phải values[i-1]
, vì cuộc gọi Skip
có hiệu quả làm thay đổi các chỉ mục.
bool isSequential = Enumerable.Range(values.Min(), values.Count())
.SequenceEqual(values);
tôi không biết tại sao điều này đã không được chọn là câu trả lời. nó rực rỡ đơn giản. – user1830285
Một tùy chọn khác là sử dụng Aggregate để lặp lại chuỗi một lần.
Lưu ý rằng không giống như All
đề xuất bởi Reed Copsey Aggregate
không thể dừng lại ở giữa khi tình trạng thất bại ...
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 phiên bản sẽ có iterator mang giá trị trước đó cùng hoặc mã đặc biệt mà có thể split iterator trên "Đầu tiên và phần còn lại" cho phép để thực hiện giải pháp của Reed với lặp đơn cho bất kỳ enumerable.
Added 'ToList() 'kể từ khi câu hỏi là về một danh sách. tôi muốn tiếp tục niềm vui và –
+1 Công trình này - nhưng nó có rất nhiều bộ nhớ cho các danh sách lớn và không thể đoản mạch thành công ... Tôi vẫn thích một trong các tùy chọn của tôi (đặc biệt là thứ 2 của tôi, hiệu quả hơn nếu bạn biết đó là Danh sách
Nếu bạn đã biết rằng những con số mà bạn có trong danh sách của bạn là độc đáo, và cũng có thể được sắp xếp , sau đó kiểm tra đơn giản nhất để tuần tự chỉ
lst[lst.Count - 1] - lst[0] == lst.Count - 1
là Giả ít nhất 1 phần tử trong danh sách.
- 1. Kiểm tra xem một số nguyên có phải là số nguyên của một số khác
- 2. Java, Kiểm tra xem số nguyên có phải là bội số của một số
- 3. Chuyển đổi danh sách các danh sách thành danh sách các số nguyên
- 4. C - Kiểm tra xem Số nguyên có được gán
- 5. Kiểm tra xem một số nguyên nằm trong phạm vi
- 6. Python: Kiểm tra nếu đối số là một số nguyên
- 7. kiểm tra xem một số đã tồn tại trong danh sách trong python
- 8. C++ Kiểm tra số nguyên.
- 9. tìm thấy nếu một số nguyên tồn tại trong một danh sách các số nguyên
- 10. Mathematica: Xác định xem tất cả các số nguyên trong một danh sách có nhỏ hơn một số không?
- 11. Kiểm tra xem một chuỗi có phải là số
- 12. Kiểm tra xem danh sách có trống không với LINQ
- 13. Cách được khuyến nghị để kiểm tra xem danh sách có phải là danh sách các số trong đối số của hàm không?
- 14. Python Tham gia một danh sách các số nguyên
- 15. Kiểm tra xem số phức có NaN
- 16. Kiểm tra xem chuỗi có chứa số
- 17. Kiểm tra xem giá trị nguyên đã tăng chưa?
- 18. Ruby: kiểm tra xem một chuỗi có thể được chuyển đổi sang một số nguyên
- 19. Danh sách đối số biến với tăng?
- 20. Kiểm tra xem đối tượng có phải là danh sách các danh sách trong python không?
- 21. Cách kiểm tra xem số có số thập phân không?
- 22. Kiểm tra xem một chuỗi có chứa một phần tử từ một danh sách (các chuỗi)
- 23. biến SQL để giữ danh sách các số nguyên
- 24. Kiểm tra xem chuỗi có chứa chỉ các chữ số
- 25. kiểm tra xem giá trị của một trường text có phải là số nguyên trong javascript
- 26. Kiểm tra tràn số nguyên SSE2
- 27. Thuật toán để kiểm tra xem một số có phải là số hoàn hảo
- 28. làm thế nào tôi có thể thêm danh sách số nguyên để định tuyến
- 29. Kiểm tra xem danh sách đỉnh có chứa đối tượng
- 30. Kiểm tra xem đối tượng là một số hoặc boolean
@dtb Cảm ơn bạn đã sửa chữa ... –
+1. Tôi nghĩ rằng nó cũng có thể được thực hiện với Tổng hợp (chỉ giữ sự khác biệt) để tránh lặp lại chuỗi nhiều lần ... Tôi sẽ cố gắng viết nó sau ... –
@AlexeiLevenkov Tùy chọn thứ hai của tôi chỉ lặp lại một lần, nhưng dựa vào chuỗi là danh sách. Tôi có thể thấy làm thế nào để làm điều đó với 'Aggregate', nhưng chỉ khi bạn thực hiện lambda của bạn có tác dụng phụ khó chịu ... :( –