dtb*_*dtb 6 c# linq iqueryable
我正在尝试规范化任意链.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)
Run Code Online (Sandbox Code Playgroud)
任何人都可以确认这些是预期的正确结果吗?
这是我从示例中得出的基本算法:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
知道如何确认这是否是正确的算法?
这是 TDD 的完美场景。鉴于您已经在上面定义了规范,这应该很容易实现为一系列仅几个测试。
“正确”是相当主观的,但这些例子看起来很合理。
另外,我会将通话正常化.Skip(0)。
确保清楚地定义边缘情况。例如,
.Take(11).Skip(12).Take(1)
Run Code Online (Sandbox Code Playgroud)
也许应该标准化为.Take(0)
官方对skip的定义:
绕过序列中指定数量的元素,然后返回剩余元素。
并采取:
从序列开头返回指定数量的连续元素。
根据您的示例,我认为您的测试用例正确遵循了规范。
| 归档时间: |
|
| 查看次数: |
304 次 |
| 最近记录: |