2010-03-26 33 views
6

Tôi đang cố gắng bình thường hóa các chuỗi tùy ý .Skip().Take() cuộc gọi đến một cuộc gọi .Skip() duy nhất được theo sau bởi một cuộc gọi .Take() duy nhất tùy chọn.Chuỗi chuẩn hóa của các cuộc gọi .Skip() và .Take()

Dưới đây là một số ví dụ về các kết quả mong đợi, nhưng tôi không chắc chắn nếu đây là đúng:

.Skip(5)      => .Skip(5) 
.Take(7)      => .Skip(0).Take(7) 

.Skip(5).Skip(7)    => .Skip(12) 
.Skip(5).Take(7)    => .Skip(5).Take(7) 
.Take(7).Skip(5)    => .Skip(5).Take(2) 
.Take(5).Take(7)    => .Skip(0).Take(5) 

.Skip(5).Skip(7).Skip(11)  => .Skip(23) 
.Skip(5).Skip(7).Take(11)  => .Skip(12).Take(11) 
.Skip(5).Take(7).Skip(3)  => .Skip(8).Take(4) 
.Skip(5).Take(7).Take(3)  => .Skip(5).Take(4) 
.Take(11).Skip(5).Skip(3)  => .Skip(8).Take(3) 
.Take(11).Skip(5).Take(7)  => .Skip(5).Take(6) 
.Take(11).Take(5).Skip(3)  => .Skip(3).Take(2) 
.Take(11).Take(5).Take(3)  => .Skip(0).Take(3) 

bất cứ ai có thể khẳng định đây là những kết quả chính xác để được mong đợi?


Dưới đây là các thuật toán cơ bản mà tôi có nguồn gốc từ các ví dụ:

class Foo 
{ 
    private int skip; 
    private int? take; 

    public Foo Skip(int value) 
    { 
     if (value < 0) 
      value = 0; 

     this.skip += value; 

     if (this.take.HasValue) 
      this.take -= value; 

     return this; 
    } 

    public Foo Take(int value) 
    { 
     if (value < 0) 
      value = 0; 

     if (!this.take.HasValue || value < this.take) 
      this.take = value; 

     return this; 
    } 
} 

Bất kỳ ý tưởng làm thế nào tôi có thể khẳng định nếu điều này là thuật toán có đúng không?

+0

Hết sức tò mò, điều này được sử dụng để làm gì? –

+0

@NickLarsen: Tôi đang triển khai Nhà cung cấp Truy vấn LINQ và cần chuyển đổi Bỏ qua và Thực hiện cuộc gọi thành một cặp bù/đếm đơn. – dtb

+3

Không chắc chắn cách chúng hoạt động, nhưng theo logic được cho là tôi tin bạn nên có .Skip (5) .Take (7) .Take (3) => .Skip (5) .Take (3) (lấy 3 và không phải 4). Mã của bạn dường như cũng đưa ra giá trị này, mà tôi tin là đúng – rslite

Trả lời

4

Đây là kịch bản hoàn hảo cho TDD. Do bạn đã xác định thông số của mình ở trên, nên bánh để triển khai dưới dạng một chuỗi chỉ một vài thử nghiệm.

"Đúng" khá chủ quan, nhưng những ví dụ đó có vẻ lành mạnh.

Ngoài ra, tôi sẽ bình thường hóa các cuộc gọi .Skip(0).

Đảm bảo bạn xác định rõ ràng các trường hợp cạnh của mình. Ví dụ,

.Take(11).Skip(12).Take(1) 

có lẽ nên được bình thường hóa thành một .Take(0)


Edit:

Định nghĩa chính thức của bỏ qua:

Bỏ qua một số quy định của các yếu tố trong một chuỗi và sau đó trả về các phần tử còn lại.

Và thực hiện:

Trả về một số quy định của các yếu tố tiếp giáp từ khi bắt đầu của một chuỗi.

Dựa trên ví dụ của bạn, tôi nghĩ rằng các trường hợp thử nghiệm của bạn là đúng theo thông số kỹ thuật.

+0

Vấn đề không phải là quá nhiều thực hiện đặc tả của riêng tôi, nhưng việc tìm kiếm các đặc điểm kỹ thuật "chính xác", kể từ khi tôi không phát triển khung truy vấn của riêng tôi nhưng cắm vào LINQ. Có bất kỳ tài liệu chính thức nào về cách triển khai LINQ Bỏ qua/Thực hiện không? – dtb

+0

Quyền, tài liệu không thực sự rõ ràng về cách chuỗi nên được đánh giá, nhưng từ những thông số kỹ thuật tôi đồng ý các trường hợp thử nghiệm của tôi (mà tôi bắt nguồn từ trực giác) trông lành mạnh. Tôi đoán tôi sẽ phải tạo thêm các trường hợp thử nghiệm để nắm bắt tất cả các trường hợp cạnh và cập nhật thuật toán cho phù hợp. – dtb

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