次のデータテーブル列では、最小値と最大値を取得する最も速い方法は何ですか?
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);
}
はい、これは本当に最速の方法です。 Linq Min
およびMax
拡張機能を使用すると、2回繰り返す必要があるため、常に遅くなります。 Linq Aggregate
を使用することもできますが、構文はこれよりもずっときれいになることはありません。
データテーブルでのEasiarアプローチは次のとおりです。
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();
構文を修正するために編集されました。 DataTablesでLINQを使用する場合は注意が必要であり、関数の集計も楽しいです。
はい、1つのクエリで実行できますが、結果のリストを生成してから、.Min()と.Max()を別々のステートメントの集計関数として使用する必要があります。
これは私のためにうまくいった
int max = Convert.ToInt32(datatable_name.AsEnumerable()
.Max(row => row["column_Name"]));
これを行うための最も効率的な方法(信じるかどうか)は、2つの変数を作成し、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回の繰り返し、linqスタイル:)
これを行う別の方法は
int minLavel = Convert.ToInt32(dt.Select("AccountLevel=min(AccountLevel)")[0][0]);
パフォーマンスについてはわかりませんが、正しい出力が得られます
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);
パフォーマンスに関しては、これは匹敵するはずです。 SelectステートメントとSortを使用してリストを取得し、最初または最後を選択します(ソート順序に応じて)。
var col = dt.Select("AccountLevel", "AccountLevel ASC");
var min = col.First();
var max = col.Last();
私のソリューションがパフォーマンスに関して以前の回答とどのように比較するかわかりません。
最初の質問は、DataTableオブジェクトで最小値と最大値を取得する最速の方法は何ですか、これはそれを行う1つの方法である可能性があることを理解しています。
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");
これは、ループせずに同じ結果を達成する簡単な方法です。ただし、パフォーマンスを以前の回答と比較する必要があります。私はサイロン猫が一番好きだと思った。