我想使用for循环来获取数据表列和行的平均值。我想要做的是,如果有100~1000列和行,我不能继续在代码中添加它们。是否有一个简单的代码可以在我添加列和行时自动获得平均值?
这是我的代码,我卡住了我不知道写什么?下面的区域,这个代码让我错误,请帮助...
private void button1_Click(object sender, EventArgs e)
{
DataTable dtGrid = gridData.DataSource as DataTable;
DataTable dtResult = new DataTable();
Math columnIndex = new Math();
List<double> avgList = new List<double>();
for (int i = 0; i < dtGrid.Columns.Count; i++)
{
for (int k = 1; k < dtGrid.Rows.Count; k++)
{
// ??
avgList.Add(Convert.ToDouble(dtGrid.Rows[i].ToString()));
}
}
//this is from other class name Math
/* public double getAverageValue(List<double> avgList)
{
double averageList = 0;
averageList = MathNet.Numerics.Statistics.Statistics.Mean(avgList.ToList());
return averageList;
}*/
double averageX1 = columnIndex.getAverageValue(avgList);
List<Math> list = new List<Math>();
//using get; set from other class
list.Add(new Math { Result = "Average", X1 = averageX1.ToString() });
gridData2.DataSource = list;
}
}
}
答案 0 :(得分:0)
看起来你的循环里面外面。试试这个:
DataTable dtGrid = gridData.DataSource as DataTable;
DataTable dtResult = new DataTable();
Math columnIndex = new Math();
List<double> avgList = new List<double>();
for (int k = 1; k < dtGrid.Rows.Count; k++)
{
for (int i = 0; i < dtGrid.Columns.Count; i++)
{
// ??
avgList.Add(Convert.ToDouble(dtGrid.Rows[k].Columns[i].ToString()));
}
}
此逻辑将一行中的所有列平均在一起。如果需要,可以创建一个Dictionary并分别对每列进行平均。像这样的东西
Dictionary<int, List<double>> AvgColumnList = new Dictionary<int, System.Collections.Generic.List<double>>();
这使用包含行中每列的列表的字典。如果有100列,则字典中将有100个条目,索引为0 - 99.每个字典项将包含双精度列表。
for (int k = 1; k < dtGrid.Rows.Count; k++)
{
for (int i = 0; i < dtGrid.Columns.Count; i++)
{
if (!AvgColumnList.Keys.Contains(i))
AvgColumnList.Add(i, new List<double>());
AvgColumnList[i].Add(Convert.ToDouble(dtGrid.Rows[k].Columns[i].ToString()));
}
}
答案 1 :(得分:0)
DataTable是基于零索引的,在从1
开始的代码行计数中它应该是0
,而dtGrid.Rows[i]
是一行而不是单元格值。使用下面的代码循环遍历DataTable
更新:代码已更新,因为OP希望单独保存每个列数据,而与列号无关。
List<List<double>> perColumnAvg = new List<List<double>>();
for (int i = 0; i < dtGrid.Columns.Count; i++)
{
avgList = new List<double>();
for (int k = 0; k < dtGrid.Rows.Count; k++)
{
// ??
avgList.Add(Convert.ToDouble(dtGrid.Rows[k][i].ToString()));
}
perColumnAvg.Add(avgList);
}
现在您可以将单个列平均值计算为
foreach (var columnList in perColumnAvg)
{
// place your logic here.
columnIndex.getAverageValue(columnList);
}
并且可以使用。
计算表格中的平均值double tableAvg = columnIndex.getAverageValue(perColumnAvg.SelectMany(s=>s));