Как выбрать минимальное и максимальное значения столбца в DataTable?
для следующего столбца datatable, каков самый быстрый способ получить минимальные и максимальные значения?
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
расширения всегда будут медленнее, потому что вы должны повторить дважды. Вы могли бы потенциально использовать LinqAggregate
, но синтаксис не будет гораздо красивее, чем это уже есть.
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");
Это простой способ достижения того же результата без цикла. Но производительность нужно будет сравнить с предыдущими ответами. Я думал, что больше всего люблю Сайлонских кошек.