Nice programing

LINQ에서 오름차순 / 내림차순-매개 변수를 통해 순서를 변경할 수 있습니까?

nicepro 2020. 10. 23. 18:56
반응형

LINQ에서 오름차순 / 내림차순-매개 변수를 통해 순서를 변경할 수 있습니까?


"bool sortAscending"매개 변수가 제공되는 메소드가 있습니다. 이제 LINQ를 사용하여이 매개 변수에 따라 정렬 된 목록을 만들고 싶습니다. 나는 다음을 얻었다.

var ascendingQuery = from data in dataList
                      orderby data.Property ascending
                      select data;

var descendingQuery = from data in dataList
                      orderby data.Property descending
                      select data;

보시다시피 두 쿼리는 "오름차순"응답 만 다릅니다. "내림차순". 두 쿼리를 병합하고 싶지만 방법을 모르겠습니다. 누구에게 대답이 있습니까?


IEnumerable 또는 IQueryable에서 자신 만의 확장 메서드를 쉽게 만들 수 있습니다.

public static IOrderedEnumerable<TSource> OrderByWithDirection<TSource,TKey>
    (this IEnumerable<TSource> source,
     Func<TSource, TKey> keySelector,
     bool descending)
{
    return descending ? source.OrderByDescending(keySelector)
                      : source.OrderBy(keySelector);
}

public static IOrderedQueryable<TSource> OrderByWithDirection<TSource,TKey>
    (this IQueryable<TSource> source,
     Expression<Func<TSource, TKey>> keySelector,
     bool descending)
{
    return descending ? source.OrderByDescending(keySelector)
                      : source.OrderBy(keySelector);
}

예, 여기에서 쿼리 식을 사용할 수있는 기능을 잃게됩니다.하지만 솔직히이 경우에는 실제로 쿼리 식의 이점을 누리고 있다고 생각하지 않습니다. 쿼리 표현식은 복잡한 작업에 적합하지만 단일 작업 만 수행하는 경우 해당 작업 하나만 입력하는 것이 더 간단합니다.

var query = dataList.OrderByWithDirection(x => x.Property, direction);

이것이 구현되는 방법에 관해서는 OrderBy / ThenBy에서 OrderByDescending / ThenByDescending으로 메서드를 변경합니다 . 그러나 기본 쿼리에 별도로 정렬을 적용 할 수 있습니다.

var qry = from .... // or just dataList.AsEnumerable()/AsQueryable()

if(sortAscending) {
    qry = qry.OrderBy(x=>x.Property);
} else {
    qry = qry.OrderByDescending(x=>x.Property);
}

어떤 용도? 전체 "주문"을 동적으로 생성 할 수 있지만 더 복잡합니다.

(주로 LINQ-to-Objects에 적합한) 또 다른 트릭은 -1/1의 승수를 사용하는 것입니다. 이것은 숫자 데이터에만 유용하지만 동일한 결과를 달성하는 건방진 방법입니다.


원하는 속성으로 desc를 주문하는 것은 어떻습니까?

   blah = blah.OrderByDescending(x => x.Property);

그리고 다음과 같이

  if (!descending)
  {
       blah = blah.Reverse()
  }
  else
  {
      // Already sorted desc ;)
  }

Reverse () 너무 느립니까?


@Jon Skeet이 제공 한 아름다운 솔루션 외에도 ThenBy 및 ThenByDescending이 필요했기 때문에 그의 솔루션을 기반으로 추가하고 있습니다.

    public static IOrderedEnumerable<TSource> ThenByWithDirection<TSource, TKey>(
         this IOrderedEnumerable<TSource> source, 
         Func<TSource, TKey> keySelector,  
         bool descending)
    {
        return descending ? 
               source.ThenByDescending(keySelector) :
               source.ThenBy(keySelector);
    }

참고URL : https://stackoverflow.com/questions/388708/ascending-descending-in-linq-can-one-change-the-order-via-parameter

반응형