2013-10-24 1 views
2

나는 List<String> myList을 가지고 있습니다.LINQ 's Where/Take의 기본 원리 이해

이 목록의 일부 항목 (예 : .Contains("a"))과 일치하는 10 개의 항목을 가져오고 싶습니다.

내가 가진 : 잘 작동하지만 LINQ는는 사람들의 처음 10 걸렸다 다음이 기준과 을 충족 모든 항목을 검색하는 Where 수행

Var results = myList.Where(o=>o.Contains("a")).Take(10); 

? 또는 전체 LINQ 문을 고려하여 컴파일됩니다 (즉, Where을 수행하지만 항목이 10 개가 될 때까지만 수행합니다).

+0

참조 : [LINQ 확장 방법 순서는 성능에 영향을 미치지 않습니까?] (http://stackoverflow.com/questions/10110013/order-of-linq-extension-methods-does-not-affect-performance) –

+0

@ Arran LINQ2Entities. 그 대답은 LINQ의 다른 유형에 따라 다르다고 가정합니다. –

+0

@Arran, 그는 이미 개체에 대한 구체적인 목록을 가지고 있습니다. –

답변

8

LINQ는 지연 평가를 사용합니다. 다음 줄을 수행 할 때 :

var results = myList.Where(o=>o.Contains("a")).Take(10); 

아무런 반응이 없습니다. 쿼리 만 빌드됩니다. 만약 (a foreach 또는 ToList() 함께 예) results를 열거하면 다음과 TakeWheremyList에 적용될 필요에 따라 최대 10 true 값을 찾을 때까지 Where가 실행된다. 아래의 코드에서

4

Where 문은 열거되기를 기다리는 IEnumerable을 반환합니다. Where 논리의 실행은 IEnumerable에 다음 값을 요청할 때까지 지연됩니다.

Take (10) 문은이를 수행합니다. Where 조건에 '다음 일치'를 요구합니다. 이것은 10 번 실행되고 완료됩니다. 물론 같은 이유로 Take (10) 명령문의 논리는 최종 반환 값 (결과)을 통해 열거 할 때까지 실제로 실행되지 않습니다.

그래, 일종의 최적화 된,하지만 아마 당신이 상상했던 방식으로 꽤.

2

봐 :

using System; 
using System.Collections.Generic; 
using System.Linq; 

public class Test { 
    public static void Main(String[] args) { 
     var l = new List<String>() { "a", "ab", "b", "bb", "bc", "ba", "c", "ca", "cc" }; 

     foreach (var s in l.Where(e => { Console.WriteLine(e); return e.Contains("a"); }).Take(3)) { 
      Console.WriteLine("loop: {0}", s); 
     } 
    } 
} 

출력은 다음과 같습니다

a 
loop: a 
ab 
loop: ab 
b 
bb 
bc 
ba 
loop: ba 
그래서

당신이 (평가되지 않습니다 문자열 "C"후)에 최적화되어 볼 수 있습니다.