Подтвердить что ты не робот

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

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

AccountLevel  
0  
1  
2  
3 
4b9b3361

Ответ 1

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

Ответ 2

Легким подходом к datatable может быть:

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

Ответ 3

Используйте 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, а также агрегационные функции тоже.

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

Ответ 4

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

Ответ 5

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

Ответ 6

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

int  max = Convert.ToInt32(datatable_name.AsEnumerable()
                        .Max(row => row["column_Name"]));

Ответ 7

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

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

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

Ответ 8

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

Ответ 9

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

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

var min = col.First();
var max = col.Last();

Ответ 10

Session["MinDate"] = dtRecord.Compute("Min(AccountLevel)", string.Empty);
Session["MaxDate"] = dtRecord.Compute("Max(AccountLevel)", string.Empty);

Ответ 11

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

Я понимаю, что начальный вопрос: какой самый быстрый способ получить значения min и max в объекте 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");

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