簡體   English   中英

如何使用For Loop兩次查找數據表列和行?

[英]How do I use For Loop twice to find datatable columns and rows?

我想使用循環來獲取數據表列和行的平均值。 我想做的是,如果有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;
    }
}

}

看起來你的循環里面外面。 嘗試這個:

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()));
    }
}

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));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM