2009-11-24 3 views
2

방어 프로그래밍을 좋아합니다. 예외 던지기는 싫지만이 질문은 내 질문의 대상이 아닙니다. IOrderedEnumerable 및 방어 프로그래밍

는 I 열 이름이 유효하지 않은 경우,이 방법은 지정된 열거 반환 LINQ의 확장은 방어 프로그램와 열 이름

 public static IEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression) 

에 의해 명령을 수행 할 수있는 장치.

이제 ThenBy를 사용하여의 보조 정렬 을 수행해야합니다.

 public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression) 

가 나는 IOrderedEnumerable를 반환해야합니다 그래서 나는 그 서명이 필요합니다. 내 문제는 내 방어 프로그래밍 기능을 유지하는 것입니다 : 주어진 세트를 반환해야합니다 열 이름이 잘못되었습니다.

깨끗한 방법이 있습니까? 내가 생각하고 모든 트릭의 일종 :

  • 를 사용하여 반사 속성이-정렬 허용
  • 가 위험하다 내 자신의 IOrderedEnumerable, 구현되지 않을 수 있기 때문에 위험하다 처음 발견 특성에 의해 주문 IQueryable 또는 IList에서 순서를 수행했기 때문에 다른 LinQ 작업도 수행하므로 부작용이 두려운 것입니다.

조언이 있습니까? 감사합니다.

+0

어떻게 그것을 표시, 특정 계층에서 그것을 잡기, 예외를 던지는 것보다 더 방어에 대한 질문을 받았다 방법에 대한 질문을 받았다 무엇과 관계없는 출력을 반환 프로그램의 유형에 적합한 방식으로, 그리고 버그가 다른 코드에 의해 소개되지 않았다는 확신을 가지면 enumerables 주문 enumerables를 주문하는 방법을 가정합니다. 이것은 방어 프로그래밍과 정반대 인 것처럼 보입니다. –

답변

3

주문할 수 있습니다. column이 존재하지 않으면 입력을 이전처럼 열거 할 수 있습니다. 이렇게하려면 모든 요소에 대해 동일한 값을 반환하는 키 선택기를 만듭니다.

참조 예 :

using System; 
using System.Linq; 
using System.Collections.Generic; 
using System.Reflection; 

static class Program 
{ 
    public static IOrderedEnumerable<T> OrderBy<T>(this IEnumerable<T> list, string sortExpression) where T : class 
    { 
     Func<T, Int32> keySelector = (elem) => 
     { 
      PropertyInfo pi = typeof(T).GetProperty(sortExpression, typeof(Int32)); 
      if (pi == null) 
       return 0; // return the same key for all elements 

      return Int32.Parse(pi.GetValue(elem, null).ToString()); 
     }; 

     return list.OrderBy(keySelector); 
    } 

    static void Main(string[] args) 
    { 
     // Create an array of strings to sort. 
     string[] fruits = { "apricot", "orange", "banana", "mango", "apple", "grape", "strawberry" }; 

     // Sort by "column" Length 
     foreach (string s in fruits.OrderBy<string>("Length")) 
      Console.WriteLine(s); 
     Console.WriteLine(); 

     // Sort by non-existing column 
     foreach (string s in fruits.OrderBy<string>("ength")) 
      Console.WriteLine(s); 
     Console.ReadKey(); 
    } 
} 
+0

이 예제의 "column"은 Int32 유형을 가지며 요소의 속성 중 하나 일뿐입니다. 대신 String을 입력하거나 일반 메서드를 만들 수 있습니다. –

+0

키가 항상 같을 때 (이 예에서는 0) ** 정렬은 출력이 입력과 동일한 순서를 가짐을 보장하지 않습니다. 나는 그것이 같을 것이라고 생각하지만 공식적으로는이 경우 결정되지 않을 수도있다. –

+0

결과가 입력과 같으면 열 이름이 잘못되면 불명확 한 순서는 문제가되지 않습니다. 결과가 null인지 예외인지 확인하고 싶지는 않습니다. 답변 해 주셔서 감사합니다. 너무 도움이되었습니다. 나는 그것을 가능한 빨리 시험 할 것이다. – Mose

관련 문제