2013-06-05 3 views
4

는이 같은 방법이 있습니다. 이것이 가능한가?ORDERBY 특정 속성 코드 개선

감사합니다. OrderBy

public void DoSomething(.... , bool orderByX) 
{ 
    foreach(... OrderBy(x => orderByX ? x.Location.X : x.Location.Y)) 
    { 
     ... 
    } 
} 

답변

15

더 나은 방법에 대한 람다 식

+1

+1은 자기 설명 코드입니다. – KingCronus

3

orderByX 확인이되는 주문, 기준을 전달하는 것이다.

이제
public void DoSomething<T>(.... , Func<Point, T> orderbySelector) 
{ 
    foreach(... OrderBy(p => orderbySelector(p.Location))) 
    { 
     ... 
    } 
} 

을 수행 할 수 있습니다 :

DoSomething(mySequence, point => point.X) 

또는

DoSomething(mySequence, point => point.Y) 

참고 : 당신이 원하는만큼 선택을 일반화 할 수 있습니다 (에 대한 예를 통과 홀더 당신은 의욕으로 다음 코드를 사용할 수 있습니다 또는 Location 대신 Point).

또한 주문 기준으로 bool을 전달하면 코드를 읽기 쉽게 만듭니다. 예를 들어, 나는이 메소드가하는 일을 전혀 모른다. 단지 DoSomething(list, false)이라는 호출을보고, 어떤 메소드가 false의 의미인지 알아야한다. DoSomething(list, orderByX : false) (C# 4.0에서 사용 가능)을 사용하는 것이 더 좋지만 X으로 주문하지 않으면 을 주문하는 경우 어떻게 알 수 있습니까? Y으로 주문 하시겠습니까?. 이것은 또한 호출 코드를 두 개의 정렬 기준으로 만 제한합니다 (다른 정렬 플래그를 추가하고 싶지 않습니까?)

DoSomething 이름을 공개해야합니다. 처리. 예를 들어 TraverseNodesOrderedBy(nodes, point => point.X)

2

LINQ 쿼리는 실행하기 전에 당신이 그들을 구축 할 수 있습니다 즉, 작성 가능하다 : 다른 가능한 답변 외에

public void DoSomething(.... , bool orderByX) 
{ 
    var query = ... ; 

    if (orderByX) 
     query = ... .OrderBy(x => x.Location.X); 
    else 
     query = ... .OrderBy(x => x.Location.Y); 

    foreach(var x in query) // deferred execution 
    { 
     ... 
    } 
} 

그냥 다른 옵션을 선택합니다.