2012-12-11 9 views
5

Questa domanda è stata posta in un modo o nell'altro su SO ma non in questo modo. Mi sono appena imbattuto in un problema di base in cui cercavo una soluzione soddisfacente :-) Ho ottenuto un elenco di oggetti che hanno due proprietà integer. Ora voglio trovare il valore massimo di entrambe le proprietà di tutti gli oggetti nell'elenco.
mi si avvicinò con tre soluzioni:Trova il valore massimo di due (o più) proprietà nell'elenco

Primo approccio:

int max = Math.Max(list.Max(elem => elem.Nr), list.Max(elem => elem.OtherNr)); 

Secondo approccio:

public int Max(List<Thing> list) 
{ 
    int maxNr = 0; 

    foreach (var elem in list) 
    { 
    if (elem.Nr > maxNr) 
     maxNr = elem.Nr; 
    if (elem.OtherNr > maxNr) 
     maxNr = elem.OtherNr; 
    } 

    return maxNr; 
} 

Un terzo approccio sarebbe quello di fare la cernita sia attributo e poi basta prendere la prima voce e ottieni l'una o l'altra proprietà.

Mi piacerebbe trovare il modo più veloce per farlo. Quindi di tutti gli approcci mi piace il secondo il post (dal punto di vista performace). Anche se il primo è più breve devi passare attraverso la lista due volte.

Altre soluzioni?

+1

È troppo lento? In realtà il primo mi sembra buono in termini di leggibilità e efficienza. Suppongo che senza modifiche strutturali non si ottenga più velocemente. –

+0

No non lo è, mi stavo chiedendo quale sia l'algoritmo più veloce per questa – derape

risposta

9

Se fai

int max = list.Max(elem => Math.Max(elem.Nr, elem.OtherNr)); 

è ancora un singolo-liner ma solo itera attraverso la lista una volta. Prenderò la monotonia sulla probabile leggera riduzione di efficienza dalla scrittura a mano.

(Inoltre, non avete bisogno di un cast da double a int qualche parte lì?)

+0

Mi piace questa soluzione, è ancora meglio e farà quasi la stessa di quella "scritta a mano" – derape

8

Una soluzione alternativa utilizzando LINQ se avete bisogno di più di 2 proprietà (che è il limite di Math.Max):

int max = list 
    .SelectMany(elem => new[]{ elem.Prop1, elem.Prop2, elem.Prop3 }) 
    .Max();