는이 같은 방법이 있습니다. 이것이 가능한가?ORDERBY 특정 속성 코드 개선
감사합니다. OrderBy
public void DoSomething(.... , bool orderByX)
{
foreach(... OrderBy(x => orderByX ? x.Location.X : x.Location.Y))
{
...
}
}
는이 같은 방법이 있습니다. 이것이 가능한가?ORDERBY 특정 속성 코드 개선
감사합니다. OrderBy
public void DoSomething(.... , bool orderByX)
{
foreach(... OrderBy(x => orderByX ? x.Location.X : x.Location.Y))
{
...
}
}
더 나은 방법에 대한 람다 식
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)
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
{
...
}
}
그냥 다른 옵션을 선택합니다.
+1은 자기 설명 코드입니다. – KingCronus