2009-06-08 3 views
5

나는 Func < T를 패스 할 수 있기를 원합니다? >을 사용하면 항목 목록을 정렬하는 방법을 정확하게 선택할 수 있습니다. 문제는 반환 유형이 다를 수 있으므로 ... 예를 들어 프로덕션 코드가 아닌 다음과 같이하고 싶습니다.일반 Linq 주문 기능?

Func<POline, string> poLineOrder 
if (option) poLineOrder = poline => poline.PartNumber; 
else poLineOrder = poline => poline.LineOrder; 
var orderedLines = poLines.OrderBy(poLineOrder); 

여기서 PartNumber는 문자열이지만 LineOrder는 int이며이 코드는 컴파일되지 않습니다. Expression (?)을 빌드해야만한다는 느낌이 들지만 구문을 올바르게 처리 할 수없는 것 같습니다.

(예, poline.LineOrder.ToString를 사용하여이 문제를 해결할 수 있습니다 ("D10")하지만 난 여기에 더 일반적인 질문을 부탁 해요 ... 감사합니다!)

-mdb

답변

5

OrderBy 유형 Func<Item, Key>의 키 선택기 함수와 비교 자체를 정의하는 IComparer<Key> 옵션을 예상하고있다. 당신이 downvote에 대한 언급을

Comparison<POLine> x; 

if (option) 
    x = Compare<POLine, int>(l => l.PartNumber); 
else 
    x = Compare<POLine, string>(l => l.LineOrder); 

var res = poLines.OrderBy(i => i, new FunctorComparer<POLine>(x)); 
3

VS2008 Samples에서 Dynamic LINQ을 사용하는 것이 좋습니다. 그럼 당신은 할 수 있습니다 :

var orderedLines = poLines.OrderBy(poLineOrder ? "PartNumber" : "LineOrder"); 
+0

케어를 쓸 수 있습니다 지금

class FunctorComparer<T> : IComparer<T> { private readonly Comparison<T> m_Comparison; public FunctorComparer(Comparison<T> Comparison) { this.m_Comparison = Comparison; } public int Compare(T x, T y) { return m_Comparison(x, y); } } static Comparison<TKey> Compare<TKey, TRes>(Func<TKey, TRes> Selector) where TRes : IComparable<TRes> { return (x, y) => Selector(x).CompareTo(Selector(y)); } 

:

는 다음과 같은 도우미 정의가 필요합니다? – tvanfosson

+0

@ tvanfosson, 나는 다른 아직 유효한 접근법에 대해 동일한 대우를 받았습니다. 누군가가 단지 downvote 싶었 같은데 :( – JaredPar