C# 计数出现次数 dataGridView

问题描述

我正在尝试计算某些给定数字的出现次数,如图所示。

enter image description here

为我希望它输出的程序提供 5 个数字

Número - 频率 R - 频率 A (1 - 2 - 0.4) (2 - 1 - 0.2) (3 - 2 - 0.4)

Frequência R 是数字出现的次数

我的问题是计算数字的出现次数并使用正确的值设置单元格。

频率 A 是相同的,因为我需要它出现的次数除以总行数。

我该怎么做?

解决方法

假设 dataGridView1 绑定到 DataTable(在我的示例中为 dt),或者可以,您可以做一些 Linq 功夫来投影另一个可以绑定到第二个网格的集合:

var projection = dt.AsEnumerable()
    .Select(n => n.Field<decimal>("Nome"))
    .GroupBy(d => d)
    .Select(d => new { Numero = d.Key,FrequenciaR = d.Count(),FrequenciaA = (decimal)d.Count() / dt.Rows.Count })
    .ToList();

此代码获取 Nomes 列表并按其值对它们进行分组。此时,您将拥有 3 个 IGrouping。然后 Select 投影组的键(数字),组中有多少人的计数,最后是数字除以表中的行数。

projection 是一个可以绑定到第二个数据网格的列表。您当然可以投射到您定义的类类型中。

更新

您可以直接使用 gridview 行,尽管它有点尴尬。我鼓励你考虑阅读数据绑定集合,但试试这个和我的第一个例子一样,它只是针对 DataGridViewRowCollection 做:

var projection2 = dataGridView1.Rows.Cast<DataGridViewRow>()
    .Where(dgvr => dgvr.Cells[0].Value != null) // don't count blank rows
    .Select(dgvr => (decimal)dgvr.Cells[0].Value )
    .GroupBy(d => d)
    .Select(d => new { Numero = d.Key,FrequenciaA = (decimal)d.Count() / (dataGridView1.Rows.Count - 1) }) // count - 1 to exclude last edit row
    .ToList();

如果你有 LINQPad 你可以run my example