C# 规范化.Skip()和.Take()调用链
我正在尝试对单个C# 规范化.Skip()和.Take()调用链,c#,linq,iqueryable,C#,Linq,Iqueryable,我正在尝试对单个.Skip()调用以及可选的单个.Take()调用的任意and调用链进行规范化 以下是一些预期结果的示例,但我不确定这些示例是否正确: .Skip(5) => .Skip(5) .Take(7) => .Skip(0).Take(7) .Skip(5).Skip(7) => .Skip(12) .Skip(5).Take(7)
.Skip()
调用以及可选的单个.Take()
调用的任意and调用链进行规范化
以下是一些预期结果的示例,但我不确定这些示例是否正确:
.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;
}
}
class-Foo
{
私有int-skip;
私人int?take;
公共Foo跳过(int值)
{
如果(值<0)
数值=0;
this.skip+=值;
if(this.take.HasValue)
this.take-=值;
归还这个;
}
公共Foo-Take(int值)
{
如果(值<0)
数值=0;
如果(!this.take.HasValue | | value
你知道我如何确认这是正确的算法吗?这是TDD的完美方案。鉴于您已经在上面定义了您的规范,这应该可以作为一系列测试来实现 “正确”是相当主观的,但这些例子似乎是合理的 另外,我将规范化
.Skip(0)
调用
确保清楚地定义了边缘案例。比如说,
.Take(11).Skip(12).Take(1)
应该标准化为。取(0)
编辑: 跳过的官方定义: 绕过序列中指定数量的元素,然后返回其余元素 并采取以下行动: 从序列开始返回指定数量的连续元素
根据您的示例,我认为您的测试用例正确地遵循了规范。出于好奇,这是用来做什么的?@NickLarsen:我正在实现一个LINQ查询提供程序,需要将Skip和Take调用转换为单个偏移量/计数对。不确定它们的行为,但遵循我认为您应该具备的假定逻辑。Skip(5) .Take(7).Take(3)=>.Skip(5).Take(3)(即Take 3而不是4)。您的代码似乎也给出了这个值,我相信是这样的correct@rslite:你说得对。很好!问题不在于如何实现我自己的规范,而是如何找到“正确的”规范,因为我没有开发自己的查询框架,而是插入LINQ。是否有任何正式文档说明LINQ Skip/Take实现应该如何运行?是的,文档中并没有明确说明应该如何评估链,但从这些规范中,我同意我的测试用例(我从直觉中得出)看起来神智正常。我想我必须编写更多的测试用例来捕获所有的边缘用例,并相应地更新算法。