C# 如何使用For循环两次来查找数据表的列和行?

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

我想使用for循环来获得datatable列和行的平均值。我想做的是,如果有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;
    }
}
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