C# 如何使用For循环两次来查找数据表的列和行?
我想使用for循环来获得datatable列和行的平均值。我想做的是,如果有100~1000列和行,我不能继续在代码中添加它们。有没有一个简单的代码可以在我添加列和行时自动获得平均值 这是我的代码,我被卡住了我不知道写什么??下面的区域和此代码得到我的错误,请帮助C# 如何使用For循环两次来查找数据表的列和行?,c#,winforms,datagridview,datatable,C#,Winforms,Datagridview,Datatable,我想使用for循环来获得datatable列和行的平均值。我想做的是,如果有100~1000列和行,我不能继续在代码中添加它们。有没有一个简单的代码可以在我添加列和行时自动获得平均值 这是我的代码,我被卡住了我不知道写什么??下面的区域和此代码得到我的错误,请帮助 private void button1_Click(object sender, EventArgs e) { DataTable dtGrid = gridData.DataSource as DataTa
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;
}
}
private void按钮1\u单击(对象发送者,事件参数e)
{
DataTable dtGrid=gridData.DataSource作为DataTable;
DataTable dtResult=新DataTable();
数学列索引=新数学();
List avgList=新列表();
对于(int i=0;i
}看起来您的循环是由内而外的。试试这个:
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()));
}
}
DataTable dtGrid=gridData.DataSource作为DataTable;
DataTable dtResult=新DataTable();
数学列索引=新数学();
List avgList=新列表();
for(int k=1;k
此逻辑将一行中的所有列一起求平均值。如果需要,您可以创建一个字典并分别计算每列的平均值。像这样的
Dictionary<int, List<double>> AvgColumnList = new Dictionary<int, System.Collections.Generic.List<double>>();
Dictionary AvgColumnList=new Dictionary();
这将使用一个字典,其中包含行中每列的列表。如果有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()));
}
}
for(int k=1;k
看起来您的循环是由内而外的。试试这个:
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()));
}
}
DataTable dtGrid=gridData.DataSource作为DataTable;
DataTable dtResult=新DataTable();
数学列索引=新数学();
List avgList=新列表();
for(int k=1;k
此逻辑将一行中的所有列一起求平均值。如果需要,您可以创建一个字典并分别计算每列的平均值。像这样的
Dictionary<int, List<double>> AvgColumnList = new Dictionary<int, System.Collections.Generic.List<double>>();
Dictionary AvgColumnList=new Dictionary();
这将使用一个字典,其中包含行中每列的列表。如果有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()));
}
}
for(int k=1;k
数据表是基于零索引的,在从1
开始的代码行计数中,它应该是0
,也应该是dtGrid。行[i]
是一行,而不是单元格值。使用下面的代码在数据表的每个单元格中循环
更新:更新为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);
}
并且可以使用计算表中的平均值
double tableAvg = columnIndex.getAverageValue(perColumnAvg.SelectMany(s=>s));
DataTable是基于零索引的,在从1
开始的代码行计数中,它应该是0
,也应该是dtGrid。行[i]
是一行,而不是单元格值。使用下面的代码在数据表的每个单元格中循环
更新:更新为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);
}
并且可以使用计算表中的平均值
double tableAvg = columnIndex.getAverageValue(perColumnAvg.SelectMany(s=>s));
不清楚你在问什么。你的问题到底是什么?是否要计算列值的平均值?还是要一起计算所有单元格的平均值?或者别的什么?我想平均每根柱子,而不是把它们塞进一根。因此,如果我有10列,我想让他们单独显示。所以10个答案就出现了。我在第一行的每一行都有复选框,所以我需要从第1行开始求平均值,而不是从第0行开始求平均值。这就是为什么我需要使用for循环,而不是foreach循环。不清楚你在问什么。你的问题到底是什么?是否要计算列值的平均值?还是要一起计算所有单元格的平均值?或者别的什么?我想平均每根柱子,而不是把它们塞进一根。因此,如果我有10列,我想让他们单独显示。所以10个答案就出现了。我在第一行的每一行都有复选框,所以我需要从第1行计算平均值,而不是从第0行计算平均值,这就是为什么我需要使用for循环而不是foreach循环谢谢你的回答,但我正在尝试使用for循环,因为我在第一行的标题列的正下方有复选框。所以我需要从第二行开始求平均值,而不是零。例如(inti=1;i