2012-12-20 5 views
0

이 샘플에서는 값이 이름보다 짧은 자릿수를 반환하는 인덱싱 된 Where 절을 보여줍니다. 소스 코드LINQ 쿼리에서 과부하 된 Where 연산자를 사용할 수 있습니까?

public void Linq5() 
{ 
    string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 

    var shortDigits = digits.Where((digit, index) => digit.Length < index); 

    Console.WriteLine("Short digits:"); 
    foreach (var d in shortDigits) 
    { 
     Console.WriteLine("The word {0} is shorter than its value.", d); 
    } 
} 

이제 내 질문입니다 ... 우리가 같은 LINQ 쿼리 형식이 쓸 수 : 쿼리 위에서 인덱스 값을 얻는 방법은 다음과

from u in digits where u.Length>index select u; 

?

+1

가능한 중복 http://stackoverflow.com/questions/4049773/linq-where-using-index-in-query- 언어) –

+1

중복 가능한 http://stackoverflow.com/questions/4049773/linq-where-using-index-in-query-language – Teejay

답변

1

아니요, 오버로드 된 Where 연산자는 쿼리 구문에서 사용할 수 없습니다.

쿼리 식 구문에서

하는 (비주얼 C#) 또는 (비주얼 기본) 절 Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)

당신은 인덱스를 도입 할 수의 호출로 변환 : 여기 msdn에서 인용 한 것입니다 수동 :

int index = 0; 
var query = from u in digits 
      where u.Length > index++ 
      select u; 

그러나 각 쿼리 전에 수동으로 인덱스를 재설정해야한다는 점에 유의하십시오. 기도. 색인이 필요한 경우 어쨌든 유창한 API가 최선의 선택입니다.

var query = digits.Where((u, i) => u.Length > i); 

사용하지 않을 이유가 없습니다.

+0

고마워요. 다른 옵션이 있습니까 ..? – user1849388

+0

@ user1849388 msdn에 대한 링크를 추가했습니다.이 쿼리는 Where 연산자로 변환 된 쿼리 구문을 나타냅니다. 문제는 쿼리 구문에서 where 절에'Func '을 전달해야한다는 것입니다. 거기에 몇 가지 추가 매개 변수를 추가 할 수 없습니다. 그리고 나는 왜 당신이'Where ((u, i) => u.Length> i)'를 사용하고 싶지 않은지 이해하지 못합니다. –

0

이 시도 :

string[] digits = { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine" }; 

var shortDigits = from pair in digits.Select((digit, index) => new { digit, index }) 
       where pair.digit.Length < pair.index 
       select pair.digit; 
[쿼리 언어로 인덱스를 사용하여 LINQ (의
+0

고마워요. 이것이 바로 내가 찾는 것입니다. btw, Select와 Where의 차이점은 무엇입니까? 나는 두 사업자 모두 같은 일을하고 있다고 생각한다. – user1849388

+0

Select는 일반적으로 열거 형의 모든 요소를 ​​반복하고 이러한 요소 (예를 들어 값 쌍)에 대해 뭔가를 반환해야하는 경우에 사용됩니다. Where는 일반적으로 열거 형을 주어진 조건을 만족하는 요소 목록으로 제한하는 데 사용됩니다. 오후 8시 30 분 P.S. 내 대답은 당신이 그것을 받아들이거나 upvoting 고려하는 데 유용했다;) – Salaros

관련 문제