다음을 통해 공유


실행 방식에 따라 표준 쿼리 연산자 분류

표준 쿼리 연산자 메서드의 LINQ to Objects 구현은 즉시 실행과 지연된 실행이라는 두 가지 기본 방식 중 하나로 실행됩니다. 지연된 실행을 사용하는 쿼리 연산자는 계속해서 스트리밍 방식과 비스트리밍 방식으로 분류할 수 있습니다. 쿼리 연산자 실행 방식의 차이점을 알면 특정 쿼리에서 얻을 수 있는 결과를 이해하는 데 도움이 됩니다. 특히 데이터 소스가 변경되거나 다른 쿼리에 기반하는 쿼리를 작성하는 경우 쿼리 연산자의 실행 방식을 아는 것이 중요합니다. 이 항목에서는 실행 방식에 따라 표준 쿼리 연산자를 분류합니다.

실행 방식

즉시 실행

즉시 실행은 쿼리가 선언된 코드 위치에서 데이터 소스를 읽고 작업이 수행된다는 의미입니다. 열거할 수 없는 단일 결과를 반환하는 모든 표준 쿼리 연산자는 즉시 실행됩니다.

지연된 실행

지연된 실행은 쿼리가 선언된 코드 위치에서 작업이 수행되지 않는다는 의미입니다. foreach(Visual Basic의 경우 For Each) 문을 사용하는 경우와 같이 쿼리 변수가 열거될 경우에만 작업이 수행됩니다. 즉, 쿼리가 정의된 시점이 아니라 쿼리가 실행되는 시점의 데이터 소스 내용에 따라 쿼리 실행 결과를 얻을 수 있습니다. 쿼리 변수를 여러 번 열거할 수 있는 경우 그 때마다 결과가 다를 수 있습니다. 반환 형식이 IEnumerable<T>이거나 IOrderedEnumerable<TElement>인 표준 쿼리 연산자는 거의 모두 지연된 실행 방식으로 실행됩니다.

지연된 실행을 사용하는 쿼리 연산자는 계속해서 스트리밍 방식과 비스트리밍 방식으로 분류할 수 있습니다.

스트리밍

스트리밍 연산자는 요소를 생성하기 전에 모든 소스 데이터를 읽을 필요가 없습니다. 실행 시 스트리밍 연산자는 각 소스 요소를 읽고 그에 대한 작업을 수행한 후 적합한 경우 요소를 생성합니다. 그렇지 않으면 결과 요소를 생성할 수 있을 때까지 계속 소스 요소를 읽습니다. 즉, 단일 결과 요소를 생성하기 위해 둘 이상의 소스 요소를 읽을 수 있습니다.

비스트리밍

비스트리밍 연산자는 결과 요소를 생성하기 위해 모든 소스 데이터를 읽어야 합니다. 정렬이나 그룹화 같은 작업이 이 범주에 속합니다. 실행 시 비스트리밍 쿼리 연산자는 모든 소스 데이터를 읽고 이를 데이터 구조로 만든 다음 작업을 수행하여 결과 요소를 생성합니다.

분류 표

다음 표에서는 실행 방식에 따라 각 표준 쿼리 연산자 메서드를 분류합니다.

참고

한 연산자가 두 열에 나타나는 경우 작업에 2개의 입력 시퀀스가 포함되며 각 시퀀스는 서로 다르게 계산됩니다. 이러한 경우 매개 변수 목록에서 첫 번째 시퀀스는 항상 지연된 스트리밍 방식으로 계산됩니다.

표준 쿼리 연산자

반환 형식

즉시 실행

지연된 스트리밍 실행

지연된 비스트리밍 실행

Aggregate

TSource

X

 

 

All<TSource>

Boolean

X

 

 

Any

Boolean

X

 

 

AsEnumerable<TSource>

IEnumerable<T>

 

X

 

Average

단일 숫자 값

X

 

 

Cast<TResult>

IEnumerable<T>

 

X

 

Concat<TSource>

IEnumerable<T>

 

X

 

Contains

Boolean

X

 

 

Count

Int32

X

 

 

DefaultIfEmpty

IEnumerable<T>

 

X

 

Distinct

IEnumerable<T>

 

X

 

ElementAt<TSource>

TSource

X

 

 

ElementAtOrDefault<TSource>

TSource

X

 

 

Empty<TResult>

IEnumerable<T>

X

 

 

Except

IEnumerable<T>

 

X

 X

First

TSource

X

 

 

FirstOrDefault

TSource

X

 

 

GroupBy

IEnumerable<T>

 

 

X

GroupJoin

IEnumerable<T>

 

X

Intersect

IEnumerable<T>

 

X

X

Join

IEnumerable<T>

 

X

X

Last

TSource

X

 

 

LastOrDefault

TSource

X

 

 

LongCount

Int64

X

 

 

Max

단일 숫자 값, TSource 또는 TResult

X

 

 

Min

단일 숫자 값, TSource 또는 TResult

X

 

 

OfType<TResult>

IEnumerable<T>

 

X

 

OrderBy

IOrderedEnumerable<TElement>

 

 

X

OrderByDescending

IOrderedEnumerable<TElement>

 

 

X

Range

IEnumerable<T>

 

X

 

Repeat<TResult>

IEnumerable<T>

 

X

 

Reverse<TSource>

IEnumerable<T>

 

 

X

Select

IEnumerable<T>

 

X

 

SelectMany

IEnumerable<T>

 

X

 

SequenceEqual

Boolean

X

 

 

Single

TSource

X

 

 

SingleOrDefault

TSource

X

 

 

Skip<TSource>

IEnumerable<T>

 

X

 

SkipWhile

IEnumerable<T>

 

X

 

Sum

단일 숫자 값

X

 

 

Take<TSource>

IEnumerable<T>

 

X

 

TakeWhile

IEnumerable<T>

 

X

 

ThenBy

IOrderedEnumerable<TElement>

 

 

X

ThenByDescending

IOrderedEnumerable<TElement>

 

 

X

ToArray<TSource>

TSource 배열

X

 

 

ToDictionary

Dictionary<TKey, TValue>

X

 

 

ToList<TSource>

IList<T>

X

 

 

ToLookup

ILookup<TKey, TElement>

X

 

 

Union

IEnumerable<T>

 

X

 

Where

IEnumerable<T>

 

X

 

참고 항목

참조

Enumerable

개념

표준 쿼리 연산자 개요

표준 쿼리 연산자의 쿼리 식 구문

LINQ to Objects