2009-06-08 25 views
5

Func < T, içinde geçiş yapabilmek ister misiniz? > tam olarak bir öğe listesini nasıl sıralamanızı seçmeme izin veriyor ... sahip olduğum sorun geri dönüş türünün değişebileceğidir ... yani örneğin böyle bir şey yapmak istiyorum (üretim kodu değil):Genel Linq siparişi işlevi?

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

Burada sorun, PartNumber bir dize olsa da, LineOrder bir int'dir ve bu kod derlenmez. Bir ifade (I) oluşturmak zorunda kalacağım ama sözdizimi doğru göremiyorum.

(Evet, poline.LineOrder.ToString kullanarak, bu çözebilir ("D10") ama burada daha genel bir soru soruyorum ... teşekkürler!)

-mdb

cevap

5

OrderBy tip Func<Item, Key> bir anahtar Seçici-fonksiyonu ve karşılaştırma kendisi tanımlamak için IComparer<Key> opsiyonel beklemektedir. Eğer downvote hakkında yorum yapmak

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

Dynamic LINQ'u VS2008 Samples'dan kullanmayı düşünebilirsiniz. Sonra yapabilirsiniz:

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

Care yazabilir Şimdi

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)); } 

:

Aşağıdaki yardımcı tanımlarını gerekir? – tvanfosson

+0

@tvanfosson, Farklı ama geçerli bir yaklaşım için aynı tedaviyi aldım. Birisi sadece aşağı çekmek istedim gibi görünüyor :( – JaredPar