2009-06-23 11 views
10

Ho la seguente collezione List<int> e ho bisogno di trovare il numero intero più alto nella collezione. Potrebbe avere un numero arbitrario di numeri interi e io posso avere lo stesso valore intero per più volte.Trova il numero intero più alto in un elenco generico usando C#?

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

Qual è l'algoritmo più semplice da utilizzare per trovare il numero intero più alto? Sto usando C# e il framework .NET 3.5.

+7

Illimitato? Sono molti interi. – Hardwareguy

+0

Credo che questa sia una domanda trabocchetto. – Groo

+0

@Groo - non una domanda trabocchetto. –

risposta

68

si può solo fare:

int max = MyList.Max(); 

Vedi Enumerable.Max per i dettagli.

+14

assicurati di aggiungere usando System.Linq; come Max è un metodo di estensione. – aquinas

6

Enumerable ha una funzione Max che lo farà.

Considerando l'implementazione per lo specifico intero method utilizzando Reflector, il metodo esegue il ciclo di ciascun elemento nell'origine IEnumerable e lo confronta con quello che in precedenza era il valore più alto.

9

Se è necessario recuperare il valore massimo frequentemente si potrebbe pensare di creare la propria classe di lista (o derivare da Elenco) che mantiene l'elemento massimo in una cache. Tale classe potrebbe assomigliare a questo:

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 

} 

In alternativa, si potrebbe derivare da List direttamente e sovrascrivere l'Add e Remove metodi (praticamente tutti i metodi che modificano gli elementi della lista) e aggiornare la cache di conseguenza.

Se un tale approccio è davvero un vantaggio dipende dal proprio scenario. Sicuramente è che se si dispone di un elenco molto grande con è raramente aggiornato e è necessario recuperare il massimo frequentemente. Altrimenti vai per le soluzioni già suggerite perché sono molto più semplici.

+3

Avrai bisogno di uno stato che indichi se il max è attualmente valido. Non dovrebbe essere valido se viene rimosso un elemento che è uguale al massimo. In questo caso, il metodo get dovrà rieseguire la scansione dell'elenco (utilizzando il metodo di estensione massima, probabilmente) per un nuovo massimo. Potresti anche solo usare un elenco ordinato, ma ci sono altri prezzi associati a questo. – Brian

+0

Sì, hai ragione. Ero pigro e ho fornito solo una classe Sceleton dove ho omesso il metodo (i) di rimozione e l'indicizzatore in cui la cache deve essere invalidata. Ho anche omesso il metodo per ricalcolare la cache che potrebbe utilizzare Enumberable.Max. –

1

genericlist.Remove (genericlist.Max)

Problemi correlati