Tôi đang cố gắng bình thường hóa các chuỗi tùy ý .Skip()
và .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?
Hết sức tò mò, điều này được sử dụng để làm gì? –
@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
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