我正在尝试计算 datagridview 中多列的总和,然后获取平均值。
此列包含一些值,例如“3x8”(用于锻炼训练),我想计算多列的第一个值 (3) 的总和
我发现的唯一结果是获得像这样的字符串总和。所以如果我第一列有 3x8,第二列有 3x8,结果就是 33。自然,我想得到 6。
这是我的 datagridview 示例:
Group Val1 to sum Val2 to sum
-------------------------------------
group1 3x8 3x8
-------------------------------------
group1 1x5 5x5
-------------------------------------
group3 2x20 2x10
-------------------------------------
这是我正在使用的代码:
var Su = dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(row => row.Cells["Group"].Value != null)
.Where(row => row.Cells["Val1"].Value != null)
.GroupBy(row => row.Cells["Group"].Value.ToString())
.Select(g => new
{
Group = g.Key,
Sum = g.Sum(row => {
int sum = 0;
if (row.Cells["week1"].Value.ToString().Contains("x"))
{
Debug.WriteLine("true condition 1");
sum += (Convert.ToInt32(row.Cells[1].Value.ToString().Split('x')[0] + row.Cells[2].Value.ToString().Split('x')[0])) ;
return sum;
}
else {
Debug.WriteLine("true else");
return 0; }
})
有办法做到这一点吗?
您只需解析单元格的内容以符合您的 0x0 模式,然后将解析的数字相加。有很多方法可以做到这一点。如果它不是 datagridviewrows,而只是一个数据数组,它可能看起来像这样,可以想象很多变体:
var gridsRows = new ITuple[] { // using value tuples
("group1", "3x8", "3x8"),
("group1", "1x5", "5x5"),
("group3", "2x20", "2x10"),
("group4", "14x4", "-")
};
var parser = new Regex (@"^\s*(\d+)x\d+\s*$", RegexOptions.Compiled);
var groupedSums = new Dictionary<string, int>(gridsRows
.GroupBy(row => (string)row[0], (key, rows) => new KeyValuePair<string, int>(key,
rows.Sum(r => ValOrZero(1, r) + ValOrZero(2, r)))));
foreach (var sum in groupedSums)
Console.WriteLine("{0}: {1,4}", sum.Key, sum.Value);
/* Prints:
group1: 12
group3: 4
group4: 14
*/
int ValOrZero(int columnIndex, ITuple row) {
return row[columnIndex] is string val
&& parser.Match(val) is { Success: true} m
? int.Parse(m.Groups[1].Value) : 0;
}
“翻译”回 WinForms DataGridView:
var parser = new Regex (@"^\s*(\d+)x\d+\s*$", RegexOptions.Compiled);
var groupedSums = new Dictionary<string, int>( dataGridView1.Rows.Cast<DataGridViewRow>()
.Where(row => row.Cells[0].Value != null)
.Where(row => row.Cells[1].Value != null)
.GroupBy(row => row.Cells[0].Value.ToString(), (key, rows) => new KeyValuePair<string, int>(key,
rows.Sum(r => ValOrZero(1, r) + ValOrZero(2, r)))));
foreach (var sum in groupedSums)
Console.WriteLine("{0}: {1}", sum.Key, sum.Value);
int ValOrZero(int columnIndex, DataGridViewRow row) {
return row.Cells[columnIndex].Value?.ToString() is {} val
&& parser.Match(val) is { Success: true} m
? int.Parse(m.Groups[1].Value) : 0;
}
我同意第一个答案。只需要解析单元格的内容以符合您的 0x0 模式,然后将 paJrsed 的数字相加即可。