2013-04-10 32 views

Trả lời

16

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.

+0

@dtb Cảm ơn bạn đã sửa chữa ... –

+0

+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 ... –

+0

@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 ... :( –

10
bool isSequential = Enumerable.Range(values.Min(), values.Count()) 
           .SequenceEqual(values); 
+0

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

2

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.

+0

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

+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 ). –

-1

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.

Các vấn đề liên quan