2010-02-23 12 views
175

साथ मैं एक बुनियादी वर्ग है कि मैं एक सूची में हेरफेर करना चाहते LINQ, की तरह कुछ का उपयोग कर के साथ शुरू निम्नलिखित:एकाधिक आदेशानुसार LINQ

public class FooBar 
{ 
    public virtual int Id { get; set; } 
    public virtual string Foo{ get; set; } 
    public virtual string Bar{ get; set; } 
} 

यह है कि मैं क्या अंततः पता चला का उपयोग कर अपनी समस्या का समाधान करने के लिए है गैर लैम्ब्डा LINQ सामान।

// code somewhere else that works and gets the desired results 
var foobarList = GetFooBarList(); // Abstracted out - returns List<Foobar> 

// Interesting piece of code that I want to examine 
var resultSet = from foobars in foobarList 
       orderby foobars.Foo, foobars.Bar 
       select foobars; 

// Iterate and do something interesting 
foreach (var foobar in resultSet) 
{ 
    // Do some code 
} 

क्या मैं के बारे में वास्तव में उत्सुक हूँ अगर एक ही सामान्य IEnumerable के बंद Lambda आधारित विस्तार तरीकों का उपयोग कर एक ही बात को पूरा करने के पूरा किया जा सकता है। इसे पूरा करने के

var resultSet = foobarList.OrderBy(x => new {x.Foo, x.Bar}) 
          .Select(x=>x); 

हालांकि निम्नलिखित अगर मुझे लगता है कि मैं एक रनटाइम त्रुटि जब मैं foreach बयान हिट मिलता है गूगल मुझसे कहता है मैं की तरह कुछ कर सकते हैं। त्रुटि मुझे बताती है कि कम से कम एक ऑब्जेक्ट को IComparible को कार्यान्वित करना है, जिसे मैं देख सकता हूं क्योंकि जब से मैं .rderBy() विधि के लिए अनाम प्रकार का उपयोग कर रहा हूं।

तो क्या मैं लैम्ब्डा मार्ग का उपयोग करने के लिए क्या करना चाहता हूं?

+3

आप को पता है कि "धाराप्रवाह तरीकों" हर संभव क्वेरी अभिव्यक्ति के लिए इसी रहे हैं चाहते हैं, विनिर्देश की धारा 7.15.2 पढ़ें। –

+2

@ एरिक लिपर्ट, एक सी # 3.0 क्वेरी अभिव्यक्ति अनुवाद धोखा शीट है, जो बार्ट डेसमेट द्वारा लिखी गई है, जिसे मैंने त्वरित संदर्भ के रूप में बहुत उपयोगी पाया: http://bartdesmet.net/blogs/bart/archive/2008/08/30/ सी -3-0-क्वेरी-अभिव्यक्ति-अनुवाद-धोखा-शीट.एएसपीएक्स। –

+0

LINQ में एकाधिक "ऑर्डर" द्वारा संभावित डुप्लिकेट (http://stackoverflow.com/questions/298725/multiple-order-by-in-linq) – jrummell

उत्तर

416

आप ThenBy और ThenByDescending विस्तार तरीकों का उपयोग कर सकते हैं:

foobarList.OrderBy(x => x.Foo).ThenBy(x => x.Bar) 
+7

मान लीजिए कि प्रश्न पूछने से पहले मुझे पूरी तरह से एपीआई प्राप्त करना चाहिए;) ऐसा लगता है कि आप चेन कर सकते हैं। फिर से() कथन जितनी बार आपको चाहिए। एक बार फिर धन्यवाद! – sdanna

+23

'ANDThen()' –

+61

'No.3Then()! –

संबंधित मुद्दे