2010-03-26 2 views
6

.Skip().Take()의 임의의 체인을 .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; 
    } 
} 

이 올바른 알고리즘이 경우 제가 확인할 수있는 방법 어떤 생각?

+0

호기심에서 벗어나이게 무슨 용도로 사용됩니까? –

+0

@NickLarsen : LINQ 쿼리 공급자를 구현 중이며 Skip 및 Take 호출을 단일 오프셋/개수 쌍으로 변환해야합니다. – dtb

+3

그들이 어떻게 행동하는지 잘 모르겠지만 추측 된 논리에 따르면 나는 당신이 .Skip (5)을 가져야한다고 믿는다. (7) .Take (3) => .Skip (5) .Take (3) 4). 당신도 코드가이 값을주는 것처럼 보입니다. 나는 정확하다고 믿습니다. – rslite

답변

4

이것은 TDD의 완벽한 시나리오입니다. 위의 사양을 정의 했으므로 케이크을 일련의 테스트로 구현해야합니다.

"정답"은 상당히 주관적이지만,의 예는 제정신처럼 보입니다.

또한 .Skip(0) 전화를 정상화합니다.

가장자리 케이스를 명확하게 정의하십시오. 예를 들어,

.Take(11).Skip(12).Take(1) 

아마 .Take(0)


편집으로 정규화해야합니다

스킵의 공식 정의 :

는 지정된 수의 요소에서 건너 뛴 시퀀스를 만들고 나머지 요소를 반환합니다.

그리고 걸릴 :

은 시퀀스의 시작 위치에서 지정된 수의 연속 요소를 돌려줍니다.

예를 기반으로 테스트 케이스가 사양을 제대로 준수한다고 생각합니다.

+0

문제는 내 자신의 사양을 구현하는 것이 아니라 "올바른"사양을 찾는 것입니다. 내 자신의 쿼리 프레임 워크를 개발하지는 않지만 LINQ에 연결하기 때문입니다. LINQ Skip/Take 구현이 어떻게 작동해야하는지에 대한 공식 문서가 있습니까? – dtb

+0

맞습니다. 설명서는 실제로 체인을 평가하는 방법에 대해 명시 적으로 설명하지는 않지만 이러한 사양에서 본인이 직감에서 파생 된 테스트 사례에 동의합니다. 나는 모든 엣지 케이스를 잡아서 그에 따라 알고리즘을 업데이트하기 위해 더 많은 테스트 케이스를 만들어야 할 것 같다. – dtb