2012-04-09 3 views
0

처리 파이프 라인

 var query = Process.GetProcesses() 
          .OrderBy(p => p.WorkingSet64) 
          .ThenByDescending(p => p.Threads.Count); 
          .Where(p => p.ProcessName.Length < 9); 

그것은 잘 작동 가지고 이해. 가져 오기

 var query = Process.GetProcesses() 
          .OrderBy(p => p.WorkingSet64) 
          .ThenByDescending(p => p.Threads.Count); 
          //.Where(p => p.ProcessName.Length < 9); 

     query = query.Where(p => p.ProcessName.Length < 9); 

이것은 작동하지 않습니다. 왜 첫 번째 방법이 작동하는지 이해가 안됩니다. 내 마음 속에는 이러한 쿼리가 동일합니다. ThenByDescending은 Where()에 파이프 된 IOrderedEnumerable<T>을 반환합니다. Where는 IEnumerable<T>에서만 작동하기 때문에 첫 번째 방법은 작동하지 않아야합니다. 아아 ... 작동합니다.

이 처리 파이프 라인은 어떻게 작동합니까?

+1

배열은'IEnumerable'과'GetProcesses'가 프로세스의 배열을 반환한다고 가정합니다. http://msdn.microsoft.com/en-us/library/system.array.aspx –

답변

8

차이점은 var 키워드와 LINQ 쿼리의 오해 때문입니다. var 키워드를 사용

var (C# reference)

할당의 오른쪽과 같은 유형을 지정하는 것과 같습니다. 변수에 유형을 할당 할 수있는 것은 아닙니다.

LINQ 쿼리에서 대부분의 기본 식은 IEnumerable을 반환하지만 많은 경우에는 IEnumerable을 반환하지 않습니다. 대신 IEnumerable에서 상속되는 형식을 반환합니다. 이 경우

, 당신은이의 동등하고있다 : IEnumerable에서 IOrderedEnumerable 상속, 당신은 그것을 사용할 수 있기 때문에

IEnumerable<Process> query = Process.GetProcesses() 
          .OrderBy(p => p.WorkingSet64) 
          .ThenByDescending(p => p.Threads.Count); 
          .Where(p => p.ProcessName.Length < 9); 

첫 번째 조각이 작동

IOrderedEnumerable<Process> query = Process.GetProcesses() 
            .OrderBy(p => p.WorkingSet64) 
            .ThenByDescending(p => p.Threads.Count); 

// Won't work because Where doesn't return an IOrderedEnumerable. 
query = query.Where(p => p.ProcessName.Length < 9); 

이유는 그렇게.

두 번째 예에서 문제를 해결하려면 queryIEnumerable<Process>으로 명시 적으로 선언해야합니다.