2013-04-24 90 views
2

我有從我的數據庫填充數字數據的DataTable對象。我必須處理所有可能的類似數字的數據類型(int32,int64,float,甚至datetime,但最後不需要)。處理DataTable中的數據 - 如何查找每列的最小值和最大值?

我不得不單獨正常化列每一列的所有數據,所以需要找到最大和最小值爲每一列來計算歸一化係數。

我必須遍歷「手動」通過所有行找到這些最大值和最小值?

一些背景資料:

我不希望這樣做的SQL,因爲它的一種科學的應用,在用戶工作在SQL語言和寫入非常複雜的SQL查詢。我不想強迫用戶寫出更加複雜查詢來獲得規範化的數據或獲得的最大/最小值

Colums是完全動態的,它們依賴於用戶編寫的SQL查詢。

+0

工作得很好,你可以採取的列值作爲一個IEnumerable ??? – 2013-04-24 13:39:15

+0

都是整型數據類型? – Arshad 2013-04-24 13:40:00

+0

@Daniel我不知道如何使用的IEnumerable :( – Kamil 2013-04-24 13:41:37

回答

3

我是否必須通過所有行「手動」迭代才能找到這些最大值和最小值?

定義手動。是的,你必須通過列舉所有的DataRows來計算MinMax的值。但是,這是可以做到無論是與老DataTable.Compute方法或

Linq

int minVal = table.AsEnumerable().Min(r => r.Field<int>("ColName")); 
int maxVal = table.AsEnumerable().Max(r => r.Field<int>("ColName")); 

DataTable.Compute

int maxVal = (int)table.Compute("Max(ColName)", ""); 
+0

謝謝你。你能告訴一些關於速度和內存使用上這2種方法,或者我必須檢查一下自己? – Kamil 2013-04-24 13:57:30

+0

Linq在可讀性,可擴展性和可維護性方面更加強大。兩者在速度和內存使用方面都相似(即使DataRow.Field擴展方法需要對值進行裝箱/取消裝箱即使它看起來是強類型的)。 – 2013-04-24 14:02:51

1

試試這個:

var min = myTable.AsEnumerable().Min(x => (int)x["column"]); 
var max = myTable.AsEnumerable().Max(x => (int)x["column"]); 

你需要確保你有一個參考System.Data.DataSetExtensions,這是不是默認添加到新的項目。

1

您還可以使用

Convert.ToInt32(datatable.Compute("min(columnname)", string.Empty)); 
Convert.ToInt32(datatable.Compute("max(columnname)", string.Empty)); 
1

你可以這樣做通過使用DataTable.Select()作爲:

DataRow [] dr = dataTable.Select("ID= MAX(ID)"); 

if(dr !=null) 
    { 
    // Console.WriteLine(dr[0]["ID"]); 
     int maxVal=Convert.ToInt32(dr[0]["ID"]); 
    } 
0

這對我

int max = Convert.ToInt32(datatable_name.AsEnumerable() 
         .Max(row => row["column_Name"])); 
相關問題