我已經採用一個DataTable
作爲參數,並返回NormalData
類型的對象爲在數據表中 NormalData定義中的每個列的函數重構LINQ方法
public class NormalData
{
//AttributeName = ColumnName of DataTable
public string AttributeName { get; set; }
//each column will have its mean and standard deviation computed
public double Mean { get; set; }
public double StandardDeviation { get; set; }
//a DataTable with three columns will create an IEnumerable<NormalData>
//with a count of three
}
以下工作,但我想一個我如何實現這第二個觀點:
public static IEnumerable<NormalData> GetNormalDataByTableColumns(DataTable dt)
{
//get list of column names to iterate over
List<string> columnList = GetDataTableColumnNames(dt);
List<NormalData> normalDataList = new List<NormalData>();
for (int i = 0; i < columnList.Count; i++)
{
//creates a NormalData object for each column in the DataTable
NormalData normalData = new NormalData();
//find average
normalData.Mean = GetColumnAverage(dt, columnList[i]);
//find stDev
normalData.StandardDeviation = GetColumnStDev(dt,columnList[i],normalData.Mean);
normalData.AttributeName = columnList[i];
//add to NormalDataList
normalDataList.Add(normalData);
}
return normalDataList;
}
private static List<string> GetDataTableColumnNames(DataTable dt)
{
return (from DataColumn dc in dt.Columns
select dc.ColumnName).ToList();
}
private static double GetColumnAverage(DataTable dt, string columnName)
{
return dt.AsEnumerable().Average(x => x.Field<double>(columnName));
}
private static double GetColumnStDev(DataTable dt, string columnName,double average)
{
var squaredDiffs = (dt.AsEnumerable()
.Sum(x => (x.Field<double>(columnName) - average) *
x.Field<double>(columnName) - average));
return Math.Sqrt(squaredDiffs/dt.Rows.Count);
}
我的感覺是糟糕的設計是參數列表GetColumnAverage
和GetColumnStDev
都必須參加。實際上,他們應該只需要一個數值類型列表(不一定是雙精度值,但是此時硬編碼)來計算它們的值。然而,這是我今天早上得到這個工作的唯一途徑。在這個設計中我打破了什麼規則?我該如何修改這個以使GetColumn..
函數只接受在columnList
的for
循環中迭代的DataColumn
?
編輯:average
變量爲每列更改,不能重新使用。或者是否有可能這是好的設計,如果我不需要計算標準偏差並且是,只有平均值,我需要重載這些方法的版本?
這個問題似乎是題外話,因爲它所需要的代碼審查,而不是要求特定的編程問題。 – Servy
@Servy當然我有偏見,但我不同意。我相信有一個基本的LINQ方法因子的概念,我沒有正確實現,而這正是我所掌握的。但是,如果大多數人同意你的意見,那麼對於被移植到CodeReview的問題我沒有任何問題。 – wootscootinboogie
除非您希望方法返回名爲St. Dev的對象,否則請考慮更有意義的名稱。 – Magus