我已经采用一个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