Как выбрать минимальное и максимальное значения столбца в DataTable?

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

AccountLevel  
0  
1  
2  
3 

11 ответов


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, но синтаксис не будет гораздо красивее, чем это уже есть.


Easiar подход на datatable может быть:

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

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

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

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

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


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


это отлично сработало для меня

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<int>("AccountLevel")),
                                                        Max = Math.Max(a.Max, b.Field<int>("AccountLevel")) });
int min = answer.Min;
int max = answer.Max;

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


другой способ сделать это

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

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


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

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

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);

Я не знаю, как мое решение сравнивает производительность с предыдущими ответами.

Я понимаю, что первоначальный вопрос был: каков самый быстрый способ получить минимальные и максимальные значения в объекте DataTable, это может быть один из способов сделать это:

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

Это простой способ достижения того же результата без цикла. Но производительность нужно будет сравнить с предыдущими ответами. Думал, я люблю Сайлонских кошек больше всего.