Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 规范化.Skip()和.Take()调用链_C#_Linq_Iqueryable - Fatal编程技术网

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实现应该如何运行?是的,文档中并没有明确说明应该如何评估链,但从这些规范中,我同意我的测试用例(我从直觉中得出)看起来神智正常。我想我必须编写更多的测试用例来捕获所有的边缘用例,并相应地更新算法。