2009-09-28 12 views
13

ho creato un list<T> che contiene una raccolta di oggetti che hanno questa proprietà: X, Y, ZSeleziona l'eta max C#

Voglio scoprire quale oggetto nella collezione ha la maggiore Z

I provato ad utilizzare la funzione Max(), ma non capisco come viene usato ...

+1

@ csharptest.net: reinstalla la tua risposta, LINQ non è sempre la risposta migliore, se la lista è grande, il tuo LINQ risponde. – AnthonyWJones

risposta

26

Max viene utilizzato per trovare il valore massimo di una proprietà. Una volta ottenuto il valore massimo, è possibile selezionare gli oggetti il ​​cui valore corrisponde alla clausola Where.

var maxZ = list.Max(obj => obj.Z); 
var maxObj = list.Where(obj => obj.Z == maxZ); 
+3

Si noti che questo esegue due passaggi nell'elenco e può restituire più oggetti. Questi attributi possono o meno essere una preoccupazione per la tua applicazione. – Brian

+0

Se list.Count è grande, non è esattamente quel performante. – user7116

+0

+1 per la tua risposta da parte mia anche se non mi piace la lettera minuscola L (che ho capito è per la lista ma sembra spaventosamente come uno dei miei numeri preferiti). –

7
int maxAge = myList.Max(obj => obj.Z); 

il parametro utilizzato è un espresso lambda ionico. Questa espressione indica quale proprietà usare (in questo caso, Z) per ottenere il valore massimo. Questo otterrà l'età massima. Se si desidera che l'oggetto che ha la più grande di età, è possibile ordinare per età e ottenere il primo risultato:

MyType maxItem = myList.OrderByDescending(obj => obj.Z).First(); 

Se lo si fa in questo modo, si noti che se due o più elementi tutti hanno l'età massima, solo uno di questi è selezionato.

+0

Che ottiene maxAge ma non ti dice quale oggetto ha quel maxAge – AnthonyWJones

+0

ma questo restituirà il valore X giusto ??? Desidero recuperare l'oggetto con il valore più elevato X – Killercode

+0

Nota che è necessario utilizzare la direttiva "using System.Linq;" nella parte superiore del tuo file. –

0

Esso dipenderà in larga misura dal tipo di X, se è paragonabile:

var array = new[] { 
    new { X = "a", Y = "a", Z = 1 }, 
    new { X = "b", Y = "b", Z = 2 } 
}; 
var max = array.Max(x => x.Z); 
Console.WriteLine(max); 
16

per ottenere l'oggetto con il massimo valore Z si ordina sul valore Z in ordine decrescente e di ottenere il primo elemento:

TypeOfObject oldest = list.OrderByDescending(x => x.Z).First(); 

Edit:
cambiato per utilizzare l'IEnumerable.OrderByDescending metodo invece di List.Sort.

Edit 2:
Se si desidera che le prestazioni, questo è circa quattro volte più veloce rispetto alla soluzione LINQ più veloce:

int high = Int32.MinValue; 
List<TypeOfObject> highest = new List<TypeOfObject>(); 
foreach (TypeOfObject v in list) { 
    if (v.Z >= high) { 
     if (v.Z > high) highest.Clear(); 
     high = v.Z; 
     highest.Add(v); 
    } 
} 
+0

+1, a scelta: list.OrderByDescending (x => x.Z). Prima() – user7116

+0

Un paio di problemi qui. Primo, l'ordinamento è al massimo O (nlogn), dove trovare il massimo ed estrarre gli elementi di corrispondenza sono entrambi O (n). Secondo, questo ti dà solo la prima partita. Va bene se i valori sono unici o se ti interessa solo ottenere un elemento corrispondente, ma se ti servono tutti, dovrai comunque trovare il massimo e quindi estrarre le corrispondenze. – tvanfosson

+1

@sixlettervariables: Sì, sapevo che era lì da qualche parte, ma non compare nella documentazione 'Lista ', quindi ho dovuto scavare un po '... – Guffa

1

Se può implementare sia IComparable<T> o IComparable sulla tua classe in questo senso:

public Int32 CompareTo(MyClass other) { 
    return Z.CompareTo(other.Z); 
} 

È possibile ottenere il valore massimo semplicemente chiamando (ciò richiederà using System.Linq):

MyClass maxObject = list.Max(); 

Questo eseguirà un solo passaggio sull'elenco di valori.