2009-09-28 9 views
13

creé una list<T> que contiene una colección de objetos que tienen estas propiedades: X, Y, ZSeleccionar máximo de edad C#

Quiero saber cuál es el objeto de la colección tiene el mayor Z

I intentado utilizar la función Max() pero no entiendo cómo se utiliza ...

+1

@ csharptest.net: por favor vuelva a instalar su respuesta, LINQ no siempre es la mejor respuesta, si la lista es grande, usted supera las respuestas de LINQ. – AnthonyWJones

Respuesta

26

Max se usa para encontrar el valor máximo de una propiedad. Una vez que tenga el valor máximo, puede seleccionar aquellos objetos cuyo valor coincida con la cláusula Where.

var maxZ = list.Max(obj => obj.Z); 
var maxObj = list.Where(obj => obj.Z == maxZ); 
+3

Tenga en cuenta que esto hace dos pasadas sobre la lista y puede devolver varios objetos. Estos atributos pueden o no ser una preocupación para su propia aplicación. – Brian

+0

Si list.Count es grande, no es exactamente ese rendimiento. – user7116

+0

+1 por su respuesta de mi parte, aunque no me gusta la letra minúscula L (que entiendo es para la lista, pero parece espantosamente como uno de mis números favoritos). –

7
int maxAge = myList.Max(obj => obj.Z); 

el parámetro utilizado es un expreso lambda ion. Esta expresión indica qué propiedad usar (en este caso, Z) para obtener el valor máximo. Esto obtendrá la edad máxima. Si desea que el objeto que tiene el mayor edad, usted podría ordenar por edad y obtener el primer resultado:

MyType maxItem = myList.OrderByDescending(obj => obj.Z).First(); 

Si lo haces de esta manera, tenga en cuenta que si dos o más elementos tienen todos la edad máxima, sólo se uno de ellos es seleccionado.

+0

Eso obtiene el maxAge pero no te dice qué objeto tiene ese maxAge – AnthonyWJones

+0

pero esto devolverá el valor X ¿verdad? Me gustaría recuperar el objeto con la X más alta – Killercode

+0

Tenga en cuenta que tendrá que utilizar la directiva "using System.Linq;" en la parte superior de tu archivo. –

0

Se dependerá en gran medida del tipo de X, si es comparable:

var array = new[] { 
    new { X = "a", Y = "a", Z = 1 }, 
    new { X = "b", Y = "b", Z = 2 } 
}; 
var max = array.Max(x => x.Z); 
Console.WriteLine(max); 
16

Para obtener el objeto con el mayor valor de Z a clasificar en el valor de Z en orden descendente y obtener el primer elemento:

TypeOfObject oldest = list.OrderByDescending(x => x.Z).First(); 

Editar:
lo cambió a utilizar el IEnumerable.OrderByDescending método en lugar de List.Sort.

Edición 2:
Si desea rendimiento, esto es alrededor de cuatro veces más rápido que la solución LINQ más rápido:

int high = Int32.MinValue; 
List<TypeOfObject> highest = new List<TypeOfObject>(); 
foreach (TypeOfObject v in list) { 
    if (v.Z >= high) { 
     if (v.Z > high) highest.Clear(); 
     high = v.Z; 
     highest.Add(v); 
    } 
} 
+0

+1, opcionalmente: list.OrderByDescending (x => x.Z) .Primer() – user7116

+0

Un par de problemas aquí. Primero, la clasificación es en el mejor de los casos O (nlogn), donde como encontrar el máximo y extraer los elementos que coinciden son ambos O (n). Segundo, esto solo te da el primer partido. Eso está bien si los valores son únicos o si solo le interesa obtener cualquier elemento coincidente, pero si los necesita a todos, igual tendrá que encontrar el máximo y luego extraer las coincidencias. – tvanfosson

+1

@sixlettervariables: Sí, sabía que estaba allí, pero no aparece en la documentación 'List ', así que tuve que cavar un poco ... – Guffa

1

Si puede aplicar ya sea IComparable<T> o IComparable en su clase a lo largo de estas líneas:

public Int32 CompareTo(MyClass other) { 
    return Z.CompareTo(other.Z); 
} 

Puede obtener el valor máximo simplemente llamando (esto requerirá using System.Linq):

MyClass maxObject = list.Max(); 

Esto solo realizará una sola pasada sobre su lista de valores.

Cuestiones relacionadas