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
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à.
L'approche Easiar sur datatable pourrait être:
int minLavel = Convert.ToInt32(dt.Compute("min([AccountLevel])", string.Empty));
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.
CA marchait bien pour moi
int max = Convert.ToInt32(datatable_name.AsEnumerable()
.Max(row => row["column_Name"]));
Le moyen le plus efficace de le faire (croyez-le ou non) est de créer deux variables et d'écrire une boucle for
.
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
var min = dt.AsEnumerable().Min(row => row["AccountLevel"]);
var max = dt.AsEnumerable().Max(row => row["AccountLevel"]);
Session["MinDate"] = dtRecord.Compute("Min(AccountLevel)", string.Empty);
Session["MaxDate"] = dtRecord.Compute("Max(AccountLevel)", string.Empty);
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();
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.