2009-06-23 24 views
10

Mam następującą kolekcję List<int> i potrzebuję znaleźć najwyższą liczbę całkowitą w kolekcji. Może mieć dowolną liczbę liczb całkowitych i mogę mieć tę samą liczbę całkowitą przez wiele razy.Znajdź najwyższą liczbę całkowitą na liście ogólnej za pomocą C#?

List<int> MyList = new List<int> { 3, 4, 6, 7, 9, 3, 4, 5, 5 }; 

Jaki jest najprostszy algorytm do zastosowania w celu znalezienia najwyższej liczby całkowitej? Korzystam z C# i platformy .NET 3.5.

+7

Nieograniczony? To dużo liczb całkowitych. – Hardwareguy

+0

Uważam, że to podchwytliwe pytanie. – Groo

+0

@Groo - nie podchwytliwe pytanie. –

Odpowiedz

68

Można po prostu zrobić:

int max = MyList.Max(); 

Zobacz Enumerable.Max szczegóły.

+14

upewnij się, że dodajesz używając System.Linq; jako Max jest metodą rozszerzenia. – aquinas

6

Enumerable ma funkcję Max, która to zrobi.

Patrząc na implementację dla liczby całkowitej specyficznej method za pomocą Reflectora, metoda pętli przez każdy element w IEnumerable źródła i porównuje go z tym, co było poprzednio najwyższą wartością.

9

Jeśli trzeba odzyskać maksymalną wartość często myślisz o tworzeniu własnej listy klas (lub czerpać z listy), która utrzymuje maksymalną pozycję w pamięci podręcznej. Taka klasa może wyglądać następująco:

public class MaxList<T> : IList<T>, ICollection<T>, IEnumerable<T> 
{ 
    T Maximum { get; set; } 
    List<T> _list; 

    public T this[int index] { get; set; } 

    public void Add(T item) 
    { 
     if (item > this.Maximum) 
     { 
      this.Maximum = item; 
     } 
     _list.Add(item); 
    } 

    // ... IEnumerable<T>, ICollection<T> and IList<T> members 

} 

Alternatywnie, można wyprowadzić bezpośrednio z listy i zastąpić Dodaj i Usuń metod (w zasadzie wszystkie metody modyfikujące elementy listy) i zaktualizować cache odpowiednio.

Jeśli takie podejście jest tak naprawdę, świadczenie zależy od twojego scenariusza. Zdecydowanie jest, jeśli masz bardzo dużą listę z rzadko aktualizowaną i musisz często pobierać maksimum. W przeciwnym razie przejdź do rozwiązań już zasugerowanych, ponieważ są one znacznie prostsze.

+3

Potrzebny będzie stan wskazujący, czy maks. Jest aktualnie poprawna. Powinno być nieważne, jeśli usunięty element jest równy maksimum. W takim przypadku metoda get będzie musiała ponownie przeskanować listę (najprawdopodobniej za pomocą metody Max extension) na nowe maksimum. Możesz także użyć posortowanej listy, ale są też inne ceny z tym związane. – Brian

+0

Tak, masz rację. Byłem leniwy i dostarczyłem tylko klasę szkieletową, w której pominąłem metody (metody) usuwania i indeksowanie, w których pamięć podręczna musi zostać unieważniona. Pominąłem także metodę ponownego obliczania pamięci podręcznej, która może być wykorzystana w Enumberable.Max. –

1

genericlist.Remove (genericlist.Max)

Powiązane problemy