2009-06-23 12 views
10

Tengo la siguiente colección List<int> y necesito encontrar el número entero más alto en la colección. Podría tener un número arbitrario de enteros y puedo tener el mismo valor entero varias veces.¿Busca el número entero más alto en una lista genérica usando C#?

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

¿Cuál es el algoritmo más simple para encontrar el número entero más alto? Estoy usando C# y el framework .NET 3.5.

+7

Ilimitado? Eso es un montón de enteros. – Hardwareguy

+0

Creo que esta es una pregunta capciosa. – Groo

+0

@Groo: no es una pregunta engañosa. –

Respuesta

68

sólo se puede hacer:

int max = MyList.Max(); 

Ver Enumerable.Max para más detalles.

+14

asegúrese de agregar usando System.Linq; como Max es un método de extensión. – aquinas

6

Enumerable tiene una función Max que hará esto.

Al observar la implementación del entero method utilizando Reflector, el método recorre cada elemento en la fuente IEnumerable y lo compara con el que anteriormente era el valor más alto.

9

Si necesita recuperar el valor máximo con frecuencia, puede pensar en crear su propia clase de lista (o derivar de List) que mantiene el elemento máximo en una caché. una clase de este tipo podría tener este aspecto:

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 

} 

Como alternativa, podría derivar de la lista directamente y sobrescribir la opción Agregar y quitar métodos (básicamente todos los métodos que modifican elementos de la lista) y actualizar la memoria caché en consecuencia.

Si este enfoque es realmente un beneficio depende de su situación. Definitivamente es que si tiene una lista muy grande rara vez se actualiza y necesita recuperar el máximo con frecuencia. De lo contrario, busque las soluciones ya sugeridas porque son mucho más simples.

+3

Deberá tener un estado que indique si el máximo es actualmente válido. No debería ser válido si se elimina un elemento que es igual al máximo. En este caso, el método get necesitará volver a escanear la lista (utilizando el método de extensión Max, probablemente) para obtener un nuevo máximo. También podría usar una lista ordenada, pero hay otros precios asociados con eso. – Brian

+0

Sí, tienes razón. Era flojo y solo proporcioné una clase de sceleton donde omití los métodos de eliminación y el indexador donde el caché debe invalidarse. También dejé el método para recalcular el caché que podría estar usando Enumberable.Max. –

1

lista generic.Remove (genericlist.Max)

Cuestiones relacionadas