¿Cómo seleccionar valores mínimos y máximos de una columna en una tabla de datos?

Para la siguiente columna de tabla de datos, ¿cuál es la forma más rápida de obtener los valores mínimo y máximo?

AccountLevel 0 1 2 3 

 int minAccountLevel = int.MaxValue; int maxAccountLevel = int.MinValue; foreach (DataRow dr in table.Rows) { int accountLevel = dr.Field("AccountLevel"); minAccountLevel = Math.Min(minAccountLevel, accountLevel); maxAccountLevel = Math.Max(maxAccountLevel, accountLevel); } 

Sí, esta es realmente la manera más rápida. El uso de las extensiones Linq Min y Max siempre será más lento porque debe iterar dos veces. Podrías utilizar Linq Aggregate , pero la syntax no será mucho más bonita de lo que ya es.

El enfoque fácil en datatable podría ser:

 int minLavel = Convert.ToInt32(dt.Compute("min([AccountLevel])", string.Empty)); 

Use LINQ. Funciona muy bien en las tablas de datos, siempre que convierta la colección de filas a un IEnumerable.

 List levels = AccountTable.AsEnumerable().Select(al => al.Field("AccountLevel")).Distinct().ToList(); int min = levels.Min(); int max = levels.Max(); 

Editado para corregir la syntax; es complicado cuando se usa LINQ en DataTables, y las funciones de agregación también son divertidas.

Sí, se puede hacer con una consulta, pero deberá generar una lista de resultados, luego usar .Min () y .Max () como funciones de agregación en declaraciones separadas.

La manera más eficiente de hacer esto (créalo o no) es crear dos variables y escribir un ciclo for .

Esto funcionó bien para mi

 int max = Convert.ToInt32(datatable_name.AsEnumerable() .Max(row => row["column_Name"])); 
 var answer = accountTable.Aggregate(new { Min = int.MinValue, Max = int.MaxValue }, (a, b) => new { Min = Math.Min(a.Min, b.Field("AccountLevel")), Max = Math.Max(a.Max, b.Field("AccountLevel")) }); int min = answer.Min; int max = answer.Max; 

1 iteración, estilo linq 🙂

otra forma de hacerlo es

 int minLavel = Convert.ToInt32(dt.Select("AccountLevel=min(AccountLevel)")[0][0]); 

No estoy seguro de la parte de rendimiento, pero esto da la salida correcta

 var min = dt.AsEnumerable().Min(row => row["AccountLevel"]); var max = dt.AsEnumerable().Max(row => row["AccountLevel"]); 

En cuanto a rendimiento, esto debería ser comparable. Use Seleccionar statement y Ordenar para obtener una lista y luego elija la primera o la última (según su orden de clasificación).

 var col = dt.Select("AccountLevel", "AccountLevel ASC"); var min = col.First(); var max = col.Last(); 
 Session["MinDate"] = dtRecord.Compute("Min(AccountLevel)", string.Empty); Session["MaxDate"] = dtRecord.Compute("Max(AccountLevel)", string.Empty); 

No sé cómo mi solución compara el rendimiento con las respuestas anteriores.

Entiendo que la pregunta inicial fue: ¿Cuál es la forma más rápida de obtener valores mínimos y máximos en un objeto DataTable? Esta puede ser una forma de hacerlo:

 DataView view = table.DefaultView; view.Sort = "AccountLevel"; DataTable sortedTable = view.ToTable(); int min = sortedTable.Rows[0].Field("AccountLevel"); int max = sortedTable.Rows[sortedTable.Rows.Count-1].Field("AccountLevel"); 

Es una forma fácil de lograr el mismo resultado sin bucles. Pero el rendimiento deberá ser comparado con las respuestas anteriores. Pensé que me encantaría que los gatos de Cylon respondieran más.