2011-11-25 18 views
1

結果はDataTableの形式で設定されています。 データテーブルには、startTimeendTimeの2つのフィールドがあります。 startTimeフィールドとendTimeフィールドの最大の違いを持つ行を取得する必要があります。DataTableでLinqを実装する方法

これはLinqを使って簡単に実装できると思いますが、データテーブルで同じことを行う方法はわかりません。

+0

は '' DataSet'に関連するDataTable'と、場合ですですから、 'DataSet'は強く型付けされていますか? –

+0

そのデータテーブル。 –

答えて

3

Linq To DataSetはあなたが探しているものです。

データテーブルでAsEnumerable()を呼び出すと、通常のLinqクエリを書き込むことができます。

+0

しかし、ここで私は開始時間と終了時間の違いで最大操作を実行したいと思います。これはLinq –

+0

@SumitGuptaはいによって可能です。私の答えを見てください。 –

2

DataTableの行をEndTimeフィールドとStartTimeフィールドの違いでソートし、上から1行目を選択することができます。

この例では、私は指定されたDataTableのうち、DataRowオブジェクトのシーケンスを取得するためにDataTableExtensions.AsEnumerable()メソッドを使用しています:

var rowWithLongestTimespan = (from row in dataTable.AsEnumerable() 
           let endTime = row.Field<DateTime>("EndTime") 
           let startTime = row.Field<DateTime>("StartTime") 
           orderby endTime - startTime descending 
           select row).First(); 
+0

ここでorderbyは使用しません。ソートはO(n * log(n))であり、maxはO(n)である。 –

+0

@ achitaka-san本当です。 IMHOこれは、 'endTime'と' startTime'の違いで行をグループ化し、その差が最高値のグループと等しい行を選択するなど、いくつかの選択肢よりも単純な解決策です。しかし、あなたが言うように、それはクエリに関係する行の数に応じて、パフォーマンスの問題を引き起こす可能性があります。 –

1
 var maxDiff = dataTable 
      .AsEnumerable() 
      .Select(row => row.Field<DateTime>("endDate") - row.Field<DateTime>("startDate")) 
      .Max(); 

     var allHavingMaxDiff = dataTable 
      .AsEnumerable() 
      .Where(row => row.Field<DateTime>("endDate") - row.Field<DateTime>("startDate") == maxDiff); 

     var oneHavingMaxDiff = allHavingMaxDiff.First(); 
関連する問題