2010-09-27 23 views
7

sto usando orderby IEnumerable per ordinare i miei oggetti in formato ascendente, ma non funziona la mia domanda è come questo:IEnumerable OrderBy

IEnumerable<Step> steps = allsteps.Where(step => step.X <= Y); 

steps = steps.OrderBy(step => step.X); 

la sua non Deffer utilizzare OrderBy o OrderByDescending

perché?

voglio usare Sum() metodo per riassumere alcuni oggetti e gli ordini: L'articolo è importante (ci sono alcune regole)

ho letto in MSDN che dovrebbero essere enumerato a lavorare, ma che cosa è il buon senso (non ho Provalo).

MODIFICA: X e Y sono di tipo double. Ho controllato il primo elemento dei miei passi (steps.First()) in quick watch.

+2

qual è il tipo di X? –

+1

Come si esamina il risultato? –

+1

Come si controlla solo il primo elemento ... sei sicuro che tutti gli elementi in 'passi' non hanno lo stesso valore X? – digEmAll

risposta

8

Prima di tutto, perché non tenerlo solo su una riga.

var steps = allsteps.Where(step => step.X <= Y).OrderBy(step => step.X); 

come "vc 74" ha sottolineato nel suo commento, se X non è primitivo o non implementa IComparable o IComparable<TypeOfX> allora non avete intenzione di essere in grado di ordinare la vostra lista, con o senza LINQ .

3

Funziona proprio come previsto:

// Create some random double values from 0 - 100 
var values = Enumerable.Repeat(new Random(), int.MaxValue) 
         .Select(r => r.NextDouble() * 100); 

//Create an enumeration with ten elements 
var pointList = values.Take(10) 
         //Cause of lacking support of IEnumerable.Zip() or .Pairwise() 
         //use this approach to create something with the properties X and Y 
         .Select(n => new PointF((float)n, (float)values.First())); 

//Sort the elements 
var sortedPoints = pointList.OrderBy(point => point.X); 

//Output to console 
foreach (var point in sortedPoints) 
{ 
    Console.WriteLine(point.ToString()); 
} 
3

sono imbattuto in un problema molto simile a questo:

IEnumerable<Article> articles = StepThree.ReturnArticles(iUserID); 
lvPending.DataSource = articles; 
lvPending.DataBind(); 

voluto cambiare l'ordine i risultati sarebbero quindi associare al mio ListView, così ho provato this:

lvPending.DataSource = articles.OrderByDescending(a=> a.DateCreated); 

Ha eseguito, ma non ha aggiornato i miei risultati. Quindi, guardando oltre, ho scoperto che poiché sto restituendo un tipo complesso, linq non può ordinarlo per me, quindi ho dovuto aggiungere l'ordine decrescente nel file StepThree.cs in cui viene richiamato il metodo ReturnArticles.

+0

Ciao david, questa domanda era per quando ero nuovo in linq :) è stato un semplice errore e funziona bene, ma non riuscivo a vederlo (in quel momento). –

+0

@SaeedAmiri: Da quando hai risolto il problema, è buona norma pubblicare la soluzione per altre persone che incappano in questo post. –

+0

@Matthew, è possibile vedere i commenti sulla domanda, infatti non c'era alcun problema, la lista ha un elemento. Non ho eliminato la domanda perché alcune delle risposte hanno un upvote e hanno cercato di risolvere il problema. –