ProgramingTip

LINQ 쿼리에서 두 개의 "where"절 또는 "&&"를 가지고 있습니까?

bestdevel 2020. 11. 2. 08:09
반응형

LINQ 쿼리에서 두 개의 "where"절 또는 "&&"를 가지고 있습니까?


여러 "와"조건을 사용하여 LINQ를 작성할 때 쿼리 각보기 조건에 대해 하나씩 또는 여러 where절을 포함 하는 one- 절을 작성해야 우리 합니까?&&where

static void Main(string[] args)
{
    var ints = new List<int>(Enumerable.Range(-10, 20));

    var positiveEvensA = from i in ints
                         where (i > 0) && ((i % 2) == 0)
                         select i;

    var positiveEvensB = from i in ints
                         where i > 0
                         where (i % 2) == 0
                         select i;

    System.Diagnostics.Debug.Assert(positiveEvensA.Count() == 
                                         positiveEvensB.Count());
}

positiveEvensApositiveEvensB 사이 에 개인적인 취향이나 코딩 스타일 (긴 줄, 가독성 등) 외에 다른 점이?

떠오르는 한 가지 가능한 차이점은 다른 LINQ 공급자가 where더 복잡한식이 아닌 여러 s 에 더 잘 대처할 수있는 것입니다. 이것이 사실입니까?


나는 개인적으로 사용할 때마다 항상 && 대 두 가지를 사용합니다.

귀하의 경우에는 전혀 눈에 만나지 않을 것입니다. 그러나 2 개의 경우에는 모든 결과를 사용하는 경우 성능에 영향을 미칠 것입니다. 예를 들어, 결과에 대해 .Count ()를 호출하거나 전체 목록을 반복하는 경우 첫 번째 항목에서 절이 실행되어 두 번째 대리 튼 사용하여 다시 완전히 열거 될 새 IEnumerable을 만듭니다.

두 절을 함께 연결하면 쿼리가 컬렉션이 열거 될 때 실행되는 단일 대리 튼 형성됩니다. 결과적으로 컬렉션을 통해 하나의 열거가 생성되고 결과가 반환 될 때마다 대리자에 대한 하나의 호출이 생성됩니다.

분할하면 상황이 바둑니다. 첫 번째 항목에서 절은 원본 컬렉션을 열거하고 두 번째에서 절은 결과를 열거합니다. 이로 외장으로 (최악의 경우) 컬렉션을 모두 2 개의 전체 열거와 구성 원당 2 개의 델리게이트가 호출됩니다. 이것은 문이 (이론적으로) 가동 속도의 2 배를 실현할 수 있습니다.

2 개의 절을 사용하기로 결정한 경우 더 제한적인 절을 먼저 배치하면 두 번째에서 첫 번째 전달하는 요소에서 실행되기 때문에 상당히 도움이됩니다.

자, 귀하의 경우 중요하지 않습니다. 컬렉션 컬렉션에서는 가능합니다. 일반적으로 다음을 수행합니다.

1) 가독성 및 유지 보수성

2) 성능

이 경우 두 옵션 모두 똑같이 유지 관리 할 수 ​​있다고 생각합니다 더 성능이 좋은 옵션을 선택합니다.


이것은 대부분의 개인적인 스타일 문제입니다. 개인적으로 where조항이 한 줄에 한 조항을 그룹화합니다.

여러 개의 많은 것을 where사용하면 멀리 만드는 모든 요소에 대해 추가로 델리게이트 호출이 필요하기 때문에 성능이 경향이 있습니다. 그러나 사소한 문제 일 가능성이 높으며 러가 문제로 보이는 경우에만 그렇습니다.


성능 문제는 메모리 기반 컬렉션에만 적용됩니다. Linq to SQL은 실행을 지연시키는 방법 트리를 생성합니다. 자세한 내용은 여기 :

LINQ 확장 방법가있는 여러 WHERE 절


다른 사람들이 제안한 것처럼 그것은 개인적인 취향에 가깝습니다. 더 읽기 주류 주류의 구문을 모방하기 때문에 && 사용을 좋아합니다.

참고 URL : https://stackoverflow.com/questions/664683/should-i-use-two-where-clauses-or-in-my-linq-query

반응형