web-dev-qa-db-ja.com

データテーブルの列の最小値と最大値を選択する方法は?

次のデータテーブル列では、最小値と最大値を取得する最も速い方法は何ですか?

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

はい、これは本当に最速の方法です。 Linq MinおよびMax拡張機能を使用すると、2回繰り返す必要があるため、常に遅くなります。 Linq Aggregateを使用することもできますが、構文はこれよりもずっときれいになることはありません。

53
Aaronaught

データテーブルでのEasiarアプローチは次のとおりです。

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

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()を別々のステートメントの集計関数として使用する必要があります。

14
Cylon Cat

これは私のためにうまくいった

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

これを行うための最も効率的な方法(信じるかどうか)は、2つの変数を作成し、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回の繰り返し、linqスタイル:)

これを行う別の方法は

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

パフォーマンスについてはわかりませんが、正しい出力が得られます

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

パフォーマンスに関しては、これは匹敵するはずです。 SelectステートメントとSortを使用してリストを取得し、最初または最後を選択します(ソート順序に応じて)。

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

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

私のソリューションがパフォーマンスに関して以前の回答とどのように比較するかわかりません。

最初の質問は、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");

これは、ループせずに同じ結果を達成する簡単な方法です。ただし、パフォーマンスを以前の回答と比較する必要があります。私はサイロン猫が一番好きだと思った。

0
ZeroOne