2009-12-08 5 views
8

일부 조건에 따라 정렬 된 IQueryable이 있습니다. 이제 IQueryable에서 특정 요소의 위치를 ​​알고 싶습니다. 거기에 linq 표현식이 있나요? 말해 예를 들어 내가 번호를 얻으려면, 거기에 IQueryable의 10 개 요소는 다음과 6 요소는 조건에 일치 6.IQueryable에서 요소의 위치를 ​​결정하십시오.

+1

여섯 번째 요소가 일치하면 숫자 5를 얻지 않으시겠습니까? 일반적으로 첫 번째 요소에는 인덱스 0이 있고 두 번째 인덱스에는 1 등이 있습니다. –

+0

네가 원했던 것과 그 아래의 대답은 잘 작동합니다. – San

답변

13

먼저 항목을 필터링하여, 그 인덱스를 각 항목을 선택하고, 마지막으로 원래의 인덱스 추출 :

var result = orderedList 
    .Select((x, i) => new { Item = x, Index = i }) 
    .Where(itemWithIndex => itemWithIndex.Item.StartsWith("g")) 
    .FirstOrDefault(); 

int index= -1; 
if (result != null) 
    index = result.Index; 

시험대 :

class Program 
{ 
    static void Main(string[] args) 
    { 
     var orderedList = new List<string> 
     { 
      "foo", "bar", "baz", "qux", "quux", 
      "corge", "grault", "garply", "waldo", 
      "fred", "plugh", "xyzzy", "thud" 
     }.OrderBy(x => x); 

     // bar, baz, corge, foo, fred, garply, grault, 
     // plugh, quux, qux, thud, waldo, xyzzy 
     // Find the index of the first element beginning with 'g'. 

     var result = orderedList 
      .Select((x, i) => new { Item = x, Index = i }) 
      .Where(itemWithIndex => itemWithIndex.Item.StartsWith("g")) 
      .FirstOrDefault(); 

     int index= -1; 
     if (result != null) 
      index = result.Index; 

     Console.WriteLine("Index: " + index); 
    } 
} 

출력 :

Index: 5 
+0

+ 1- 나는 내 대답에서 똑같은 방식으로했습니다. – RichardOD

+0

이 솔루션은 모든 작업에 대해 SQL을 생성합니까 아니면 메모리에서 작업을 수행 한 후에 만 ​​IQueryable의 모든 항목을 선택합니까? –

2

그 앞의 값을 열거하는 효과가 있지만 당신은 query.TakeWhile(x => !matchesCondition(x)).Count() 같은 것을 사용할 수있는 네가 원하는대로되지 않을 수도있다.

+0

어쨌든 이전 값을 통해 열거해야합니다. 그렇지 않습니까? – treaschf

+0

흥미로운 솔루션. 앞의 값이 메모리 객체이면 열거하지만 DB는 열거하지 않는 것이 좋습니다. 요소가 목록에 없으면이 함수는 목록의 길이를 반환합니다. 일반적으로 이러한 함수는 -1 또는 아마도 null을 반환한다고 기대할 수 있습니다. –

+0

@Mark Byers : 질문의 구절은 원하는 요소가 존재하는 것으로 알려져 있고 위치 만이 필요하다는 것을 암시한다고 읽었습니다. DB 시나리오는 참으로 열거에 대한 나의 관심사였습니다. 실제로 IQueryable에 이렇게하는 것이 현명하지 않다고 생각하지만 빠른 해킹으로이 방법은 적어도 간결하고 이해할 수 있습니다. –

0

을 술어 fu에 대한 매개 변수로] 렉션 색인을 incldes하는 "Where"기능의 절점을 사용할 수도 있습니다 . 자세한 내용은 MSDN을 참조하십시오.

var result = Enumerable.Range(0, 10).Where((x, i) => i == 6); 

6 번째 요소가 없으면 버전이 비어있을 수 있습니다. 또한 결과를 반복 할 때까지 where 절을 평가하지 않습니다.

관련 문제