2010-02-23 3 views
0

나는 QuickSort와 LINQ를 가지고 놀고 있는데, 그 순서를 피벗 전, 동등 및 후에 항목으로 분리하려고합니다.피벗 주위의 시퀀스를 필터링하는 가장 좋은 LINQ 방법은 무엇입니까?

public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t) 
     where T : IComparable<T> 
    { 
     return new Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>>(
      source.Where(x => x.CompareTo(t) < 0), 
      source.Where(x => x.CompareTo(t) == 0), 
      source.Where(x => x.CompareTo(t) > 0) 
      ); 
    } 

이 작업을 수행하는 가장 좋은 방법은 무엇입니까 : 여기

는 지금까지이 무엇입니까? 이것이 최고의 구현인가, 아니면 더 좋은 구현인가? 아니면 내가 모르는 라이브러리 함수를 사용해야합니까?

+0

'OrderBy'를 사용해야합니다. – SLaks

+0

예, 나는 'OrderBy'가 가장 좋은 방법이라고 생각합니다. 실제로'QuickSort'를 재미있게 구현하려고합니다. –

+0

나는 그렇게 생각했다 ... – SLaks

답변

0

성능이 문제가되는 경우 (이 그냥 재미 있지만, 일반적으로 정렬) 당신이 그것을하고있는 방법이기 때문에, 나는, 내장 아무것도 사용하지 않을 가능성이 제안 Where 3 번 호출하면 열거 형이 3 번 반복됩니다. 난 그냥 이런 짓을 했을까 : 물론

public static Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>> ComparativeWhere<T>(this IEnumerable<T> source, T t) 
where T : IComparable<T> 
{ 

    var list1 = new List<T>(); 
    var list2 = new List<T>(); 
    var list3 = new List<T>(); 

    foreach (var item in source) 
    { 
     if (item.CompareTo(t) < 0) 
     { 
      list1.Add(item); 
     } 

     if (item.CompareTo(t) == 0) 
     { 
      list2.Add(item); 
     } 

     if (item.CompareTo(t) > 0) 
     { 
      list3.Add(item); 
     } 
    } 

    return new Tuple<IEnumerable<T>, IEnumerable<T>, IEnumerable<T>>(list1, list2, list3); 
} 

이 접근 방식의 두 가지 단점은 당신이 3 개 새 목록을 만드는 것이 없으며, 더 이상 느리게 실행하지만 인생의 모든 무역 꺼져 그렇지 ? :)

관련 문제