2012-12-11 20 views
5

To pytanie zostało zadane w taki lub inny sposób na SO, ale nie w ten sposób. Właśnie natknąłem się na bardzo podstawowy problem, w którym szukałem rozwiązania spełniającego wymagania :-) Mam listę obiektów, które mają dwie właściwości całkowite. Teraz chcę znaleźć maksymalną wartość obu właściwości wszystkich obiektów na liście.
wymyśliłem trzy rozwiązania:Znajdź maksymalną wartość dwóch (lub więcej) właściwości na liście

Pierwsze podejście:

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

Drugie podejście:

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

Trzecim rozwiązaniem byłoby zrobić sortowania zarówno atrybutu, a następnie po prostu wziąć pierwsze wejście i zdobądź jedną lub drugą nieruchomość.

Chciałbym znaleźć najszybszy sposób na zrobienie tego. Tak więc ze wszystkich podejść podoba mi się drugi post (z punktu widzenia performansu). Mimo że pierwszy jest krótszy, musisz dwukrotnie przejść przez listę.

Jakieś inne rozwiązania?

+1

Czy to zbyt wolno? W rzeczywistości pierwsza wygląda mi dobrze pod względem czytelności i wydajności. Zakładam, że bez zmian strukturalnych nie dostaniesz go szybciej. –

+0

Nie, nie, po prostu zastanawiałem się, jaki najszybszy algorytm jest dla tego – derape

Odpowiedz

9

Jeśli nie

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

to wciąż jedno-liner, ale tylko poprzez iteracje po liście. Zrobiłbym pojedynczą liniowość nad prawdopodobnym, niewielkim zmniejszeniem wydajności, pisząc ją ręcznie.

(Ponadto, nie trzeba oddanych od double do int gdzieś tam?)

+0

Podoba mi się to rozwiązanie, jeszcze lepsze i zrobi prawie to samo, co "ręcznie" – derape

8

Alternatywnym rozwiązaniem przy użyciu LINQ, jeśli potrzebujesz więcej niż 2 nieruchomości (która jest granicą Math.Max):

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