【发布时间】:2010-03-26 13:01:09
【问题描述】:
我正在尝试将.Skip() 和.Take() 调用的任意链标准化为单个.Skip() 调用,然后是可选的单个.Take() 调用。
以下是一些预期结果的示例,但我不确定这些是否正确:
.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)
谁能确认这些是预期的正确结果?
这是我从示例中得出的基本算法:
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;
}
}
知道如何确认这是否是正确的算法吗?
【问题讨论】:
-
出于好奇,这是干什么用的?
-
@NickLarsen:我正在实现一个 LINQ 查询提供程序,需要将 Skip 和 Take 调用转换为单个偏移量/计数对。
-
不确定它们的行为,但按照假定的逻辑,我相信你应该有 .Skip(5).Take(7).Take(3) => .Skip(5).Take(3 )(即取 3 而不是 4)。您的代码似乎也给出了这个值,我认为这是正确的
-
@rslite:你是对的。好收获!
标签: c# linq iqueryable