2010-02-23 19 views
175

comincio con una classe base che voglio manipolare in un elenco utilizzando LINQ, qualcosa di simile al seguente:ordinabile multipla Con con LINQ

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

Questo è ciò che in ultima analisi, scoperto per risolvere il mio problema utilizzando la roba LINQ non lambda.

// 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 
} 

Quello che sto veramente curioso di sapere è se lo stesso può essere realizzato utilizzando i metodi di estensione basate Lambda fuori del generico IEnumerable per ottenere la stessa cosa. Google mi dice che posso fare qualcosa di simile alla seguente per realizzarlo

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

Tuttavia se faccio che ottengo un errore di runtime quando ho colpito la dichiarazione foreach. L'errore mi dice che almeno un oggetto deve implementare IComparible, che posso vedere dal momento che sto usando un tipo anonimo per il metodo .OrderBy().

Quindi c'è un modo per realizzare ciò che voglio utilizzando il modo Lambda?

+3

Se volete sapere quali sono i "metodi fluente" sono corrispondenti ad ogni possibile espressione della query, la sezione 7.15.2 della specifica lettura. –

+2

@Eric Lippert, c'è un cheat Sheet di Query Expression in C# 3.0, scritto da Bart Desmet, che ho trovato molto utile come riferimento rapido: http://bartdesmet.net/blogs/bart/archive/2008/08/30/ c-3-0-query-espressione-traduzione-cheat-sheet.aspx. –

+0

possibile duplicato di [Più "ordina per" in LINQ] (http://stackoverflow.com/questions/298725/multiple-order-by-in-linq) – jrummell

risposta

416

È possibile utilizzare i metodi di estensione ThenBy e ThenByDescending:

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

Indovina che dovrei completamente passare attraverso l'API prima di porre la domanda;) Sembra anche che tu possa concatenare le istruzioni .ThenBy() tutte le volte che vuoi. Grazie ancora! – sdanna

+23

cosa dire '.AndThen()' –

+61

'No .AndThen()!' –