web-dev-qa-db-fra.com

Comment sélectionner les valeurs min et max d'une colonne dans un datatable?

Pour la colonne suivante de datatable, quel est le moyen le plus rapide d’obtenir les valeurs min et max?

AccountLevel  
0  
1  
2  
3 
59
Ahmed
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);
}

Oui, c'est vraiment le moyen le plus rapide. L'utilisation des extensions Linq Min et Max sera toujours plus lente, car vous devez effectuer une nouvelle itération. Vous pourriez potentiellement utiliser Linq Aggregate, mais la syntaxe ne sera pas beaucoup plus jolie qu'elle ne l'est déjà.

53
Aaronaught

L'approche Easiar sur datatable pourrait être:

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

Utilisez LINQ. Cela fonctionne très bien sur les tables de données, tant que vous convertissez la collection de lignes en un IEnumerable.

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

Édité pour corriger la syntaxe; c'est délicat d'utiliser LINQ sur des DataTables, et les fonctions d'agrégation sont également amusantes.

Oui, cela peut être fait avec une requête, mais vous devrez générer une liste de résultats, puis utiliser .Min () et .Max () en tant que fonctions d'agrégation dans des instructions séparées.

14
Cylon Cat

CA marchait bien pour moi

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

Le moyen le plus efficace de le faire (croyez-le ou non) est de créer deux variables et d'écrire une boucle for.

6
SLaks
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 itération, style linq :)

une autre façon de faire est

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

Je ne suis pas sûr de la performance mais cela donne le bon résultat

4
user1228498
var min = dt.AsEnumerable().Min(row => row["AccountLevel"]);
var max = dt.AsEnumerable().Max(row => row["AccountLevel"]);
2
Musakkhir Sayyed
Session["MinDate"] = dtRecord.Compute("Min(AccountLevel)", string.Empty);
Session["MaxDate"] = dtRecord.Compute("Max(AccountLevel)", string.Empty);
2
Bibek Adhikari

Performance sage, cela devrait être comparable. Utilisez les instructions Select et Sort pour obtenir une liste, puis choisissez la première ou la dernière (en fonction de votre ordre de tri).

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

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

Je ne sais pas comment ma solution compare les performances en termes de performances aux réponses précédentes.

Je comprends que la question initiale était: quel est le moyen le plus rapide d’obtenir les valeurs min et max dans un objet DataTable, c’est peut-être une façon de le faire:

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

C'est un moyen facile d'obtenir le même résultat sans bouclage. Mais les performances devront être comparées aux réponses précédentes. Je croyais que les chats Cylon répondaient le plus.

0
ZeroOne