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


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

AccountLevel  
0  
1  
2  
3 
11 53

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. Он отлично работает с таблицами данных, если вы преобразуете коллекцию строк в IEnumerable.

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

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

Да, это можно сделать с помощью одного запроса, но вам нужно будет создать список результатов, а затем использовать .Минимальный и. 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");

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