2011-09-06 6 views
5

मैं एक आदेश को परिभाषित करने Func की एक सूची है उपरोक्त कैसे करें जब सूची में अनुक्रमिक क्रमों की संख्या हो सकती है, यह जानने का प्रयास कर रहा है। क्या यह संभव है?मापदंडों का मनमाना संख्या से आदेश देने वस्तुओं को Linq

उत्तर

6
people = people.OrderBy(ordering[0]).ThenBy(ordering[1]).ThenBy(ordering[2]); 

रूप

var orderedPeople = people.OrderBy(ordering[0]); 
orderedPeople = orderedPeople.ThenBy(ordering[1]); 
orderedPeople = orderedPeople.ThenBy(ordering[2]); 
people = orderedPeople; 

ही है तो आप बस इस तरह एक पाश लिखें:

if (ordering.Count != 0) 
{ 
    var orderedPeople = people.OrderBy(ordering[0]); 
    for (int i = 1; i < ordering.Count; i++) 
    { 
     orderedPeople = orderedPeople.ThenBy(ordering[i]); 
    } 
    people = orderedPeople; 
} 
+0

आप वास्तव में एक गिनती के लिए जाँच करने के लिए की जरूरत नहीं है, अगर आप सिर्फ स्विच क्या किया जा रहा है लूप – msarchet

+0

में किया गया मुझे कुछ कारणों से "यह वही है" थोड़ा सा सच नहीं था। मैंने सोचा कि उन्हें सीधे पालन करना था। बहुत बहुत धन्यवाद। – fearofawhackplanet

+0

हम्मम्म ... वास्तव में वे वही नहीं हैं। 'फिर' '' ऑर्डर किए गए अनन्य 'पर संचालित होता है, जिसे मैंने याद किया। मुझे लगता है कि मैं इसके आसपास काम कर सकता हूं। – fearofawhackplanet

3

आप इस

के लिए इसी तरह कुछ करने के लिए सक्षम होना चाहिए
people = people.OrderBy(ordering[0]) 
foreach(var order in ordering.Skip(1)) 
{ 
    people = people.ThenBy(order); 
} 

अल ternately

for(i = 0; i < ordering.Count; i++) 
{ 
    people = i == 0 ? people.OrderBy(ordering[i]) : people.ThenBy(ordering[i]); 
} 
2

याद रखें कि LINQ निष्पादन स्थगित कर दिया गया है। आप की तरह, परिणाम तक पहुँचने में कुछ करने से पहले अभिव्यक्ति क्रमिक रूप से निर्माण कर सकते हैं: दूसरों

var ordered = unordered.OrderBy(ordering.First()); 
foreach (var orderingItem in ordering.Skip(1)) 
{ 
    ordered = ordered.ThenBy(orderingItem); 
} 
4

के रूप में उल्लेख किया है, तो आप ऐसा करने के लिए एक पाश का उपयोग कर सकते हैं।

आप चाहें, तो आप भी Aggregate ऑपरेटर का उपयोग कर सकते हैं:

// Requires a non-empty ordering sequence. 
var result2 = ordering.Skip(1) 
         .Aggregate(people.OrderBy(ordering.First()), Enumerable.ThenBy); 

(या)

// Shorter and more "symmetric" but potentially more inefficient. 
// x => true should work because OrderBy is a stable sort. 
var result = ordering.Aggregate(people.OrderBy(x => true), Enumerable.ThenBy); 
+1

मुझे इन की संक्षिप्तता पसंद है, धन्यवाद – fearofawhackplanet