Как выбрать минимальное и максимальное значения столбца в таблице данных? - PullRequest
58 голосов
/ 14 марта 2010

Для следующего столбца с данными, какой самый быстрый способ получить минимальное и максимальное значения?

AccountLevel  
0  
1  
2  
3 

Ответы [ 11 ]

97 голосов
/ 07 февраля 2011

Простой подход к данным может быть:

int minLavel = Convert.ToInt32(dt.Compute("min([AccountLevel])", string.Empty));
51 голосов
/ 14 марта 2010
int minAccountLevel = int.MaxValue;
int maxAccountLevel = int.MinValue;
foreach (DataRow dr in table.Rows)
{
    int accountLevel = dr.Field<int>("AccountLevel");
    minAccountLevel = Math.Min(minAccountLevel, accountLevel);
    maxAccountLevel = Math.Max(maxAccountLevel, accountLevel);
}

Да, это действительно самый быстрый способ. Использование расширений Linq Min и Max всегда будет медленнее, потому что вам придется повторять дважды. Вы могли бы потенциально использовать Linq Aggregate, но синтаксис не будет намного красивее, чем это уже есть.

13 голосов
/ 14 марта 2010

Используйте LINQ. Он отлично работает с таблицами данных, если вы преобразуете коллекцию строк в IEnumerable.

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

Отредактировано для исправления синтаксиса; это сложно при использовании LINQ для DataTables, а функции агрегации тоже забавны.

Да, это можно сделать одним запросом, но вам нужно будет сгенерировать список результатов, а затем использовать .Min () и .Max () в качестве агрегирующих функций в отдельных операторах.

7 голосов
/ 27 сентября 2013

Это работало нормально для меня

int  max = Convert.ToInt32(datatable_name.AsEnumerable()
                        .Max(row => row["column_Name"]));
6 голосов
/ 14 марта 2010

Самый эффективный способ сделать это (хотите верьте, хотите нет) - создать две переменные и написать цикл for.

5 голосов
/ 14 марта 2010
var answer = accountTable.Aggregate(new { Min = int.MinValue, Max = int.MaxValue }, 
                                        (a, b) => new { Min = Math.Min(a.Min, b.Field<int>("AccountLevel")),
                                                        Max = Math.Max(a.Max, b.Field<int>("AccountLevel")) });
int min = answer.Min;
int max = answer.Max;

1 итерация, стиль linq:)

4 голосов
/ 23 февраля 2012

еще один способ сделать это

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

Я не уверен в части перформанса, но это дает правильный вывод

2 голосов
/ 17 февраля 2017
Session["MinDate"] = dtRecord.Compute("Min(AccountLevel)", string.Empty);
Session["MaxDate"] = dtRecord.Compute("Max(AccountLevel)", string.Empty);
1 голос
/ 17 июля 2015

Производительность мудрая, это должно быть сопоставимо. Используйте операторы Select и Sort, чтобы получить список, а затем выберите первый или последний (в зависимости от порядка сортировки).

var col = dt.Select("AccountLevel", "AccountLevel ASC");

var min = col.First();
var max = col.Last();
1 голос
/ 15 июля 2015
var min = dt.AsEnumerable().Min(row => row["AccountLevel"]);
var max = dt.AsEnumerable().Max(row => row["AccountLevel"]);
...