2009-06-23 6 views
10

J'ai la collection suivante List<int> et j'ai besoin de trouver l'entier le plus élevé dans la collection. Il pourrait avoir un nombre arbitraire d'entiers et je peux avoir la même valeur entière pour plusieurs fois.Trouvez le nombre entier le plus élevé dans une liste générique en utilisant C#?

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

Quel est l'algorithme le plus simple à utiliser pour trouver l'entier le plus élevé? J'utilise C# et le framework .NET 3.5.

+7

Illimité? C'est beaucoup d'entiers. – Hardwareguy

+0

Je crois que c'est une question piège. – Groo

+0

@Groo - pas une question piège. –

Répondre

68

Vous pouvez juste faire:

int max = MyList.Max(); 

Voir Enumerable.Max pour plus de détails.

+14

assurez-vous d'ajouter en utilisant System.Linq; comme Max est une méthode d'extension. – aquinas

6

Enumerable a une fonction Max qui va le faire.

En examinant l'implémentation pour method spécifique à l'entier en utilisant Reflector, la méthode parcourt chaque élément de la source IEnumerable et le compare à ce qui était précédemment la valeur la plus élevée.

9

Si vous avez besoin de récupérer la valeur maximale fréquemment, vous pourriez penser à créer votre propre classe de liste (ou dériver de List) qui conserve l'élément maximum dans un cache. Une telle classe pourrait ressembler à ceci:

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 

} 

Sinon, vous pouvez tirer de la liste directement et écraser Ajouter et supprimer des méthodes (essentiellement toutes les méthodes de modification des éléments de liste) et mettre à jour le cache en conséquence.

Si une telle approche est vraiment un avantage dépend de votre scénario. C'est certainement si vous avez une très grande liste avec est rarement mis à jour et vous devez récupérer le maximum fréquemment. Sinon, optez pour les solutions déjà proposées car elles sont beaucoup plus simples.

+3

Vous devrez avoir un état indiquant si le max est actuellement valide. Il devrait être invalide si un élément est supprimé qui est égal au maximum. Dans ce cas, la méthode get devra rescanner la liste (en utilisant probablement la méthode d'extension Max) pour un nouveau maximum. Vous pouvez également utiliser une liste triée, mais il existe d'autres prix associés. – Brian

+0

Oui, vous avez raison. J'étais fainéant et ne fournissais qu'une classe sceleton dans laquelle j'omettais la ou les méthodes remove et l'indexeur où le cache devait être invalidé. J'ai également omis la méthode pour recalculer le cache qui pourrait utiliser Enumberable.Max. –

1

genericlist.Remove (genericlist.Max)

Questions connexes