如何计算datagridview列中的唯一值?

时间:2019-08-25 23:57:05

标签: c# visual-studio winforms

我需要计算除重复行之外的一列行

门牌号码 123 124 11 12 11 11

总门牌号:4

我已经搜索,但找不到适合我的代码的正确语法。 我尝试过字典,但似乎不适合我的代码。

我是使用c#的完整初学者

                //Total House
            int House = 0;
            for (int row = 0; row < dataGridView1.Rows.Count; ++row)
            {
                if ((string)dataGridView1.Rows.[row].Cells("House_Number").Distinct())
                {
                    House++;
                }
            }

            TotalHouse.Text = "Total Houses   " + $"{House}";

我尝试了上面的代码,但预期会有错误标识符。

2 个答案:

答案 0 :(得分:1)

您的代码有一些潜在的问题,但让我们从阻止其编译的问题入手。

if ((string)dataGridView1.Rows.[row].Cells("House_Number").Distinct())

这里有一个有问题的地方是Rows.[row]。那里不应该有一段时期。如果您有一个这样的时期,C#会期望一个标识符跟随它,而不是另一个运算符。在这种情况下,您必须使用[]运算符,该运算符无效。它应该看起来像这样:

if ((string)dataGridView1.Rows[row].Cells("House_Number").Distinct())

我们越来越近了。但是,if语句中的测试必须求值为booltrue的{​​{1}}。您的计算结果为false,因为您要将整个内容都转换为字符串。那是因为这部分首先运行:

string

然后这部分运行:

dataGridView1.Rows[row].Cells("House_Number").Distinct()

所以整个事情变成了字符串。我们必须删除该(string) 位。

让我们仔细看看(string)dataGridView1.Rows[row].Cells("House_Number").Distinct()不是方法-it's a property。这意味着您不能使用语法Cells。但是,Cells("House_Number")的结果是Cells,它允许使用DataGridViewCellCollection语法,因此您可以执行类似[]的操作。

Cells["House_Number"]不会为您带来Distinct()的价值,而是会以bool的形式为您提供一组唯一的单元格。

IEnumerable不会在一列中为您提供不同的单元格,而是会在一行中为您提供不同的单元格。那可能不是您想要的。

您可能会想要这样的东西:

dataGridView1.Rows[row].Cells.Distinct()

遍历以下内容:

  1. int houses = dataGridView1.Rows .Cast<DataGridViewRow>() .Select(r => (int)r["House_Number"].Value) .Distinct() .Count(); 开始。
  2. 获取dataGridView1行:DataGridViewCellCollection
  3. .Rows很老,因此它实现了DataGridViewCellCollection而不是IEnumerable。我们需要将其转换为IEnumerable<DataGridViewRow>,因此我们将其称为LINQ的IEnumerable<DataGridViewRow>
  4. 使用LINQ将其转换为Cast<DataGridViewRow>()IEnumerable<int> 一种。 .Select(r => (int)r.Cells["House_Number"].Value)的参数是lambda表达式。它使用一个参数Select,即r。它将返回一个DataGridViewRow。 b。获取该行的单元格:int C。获取我们想要的特定单元格:.Cells d。获取该单元格的价值 e。该值以["House_Number"]的形式返回;我们需要将其转换为整数:object
  5. 使用LINQ将(int)变成另一个只有不同值的IEnumerable<int>
  6. 计算我们的结果:.Distinct()

您需要引用.Count()才能起作用。如果尚不存在,请将其放在文件顶部:

System.Linq

答案 1 :(得分:0)

您可以通过向System.Data.DataSetExtensions添加nuget引用来轻松实现这一点

,然后使用linq选择不同的门牌号:

var count = dataGridView1.AsEnumerable().Select(dr => dr["House_Number"]).Distinct().Count();

否则,您可以使用哈希集实现此目标:

var hs = new HashSet<string>();

foreach (DataRow dataRow in dataGridView1.Rows)
{
    hs.Add(dataRow["House_Number"].ToString());
}

TotalHouse.Text = "Total Houses   " + $"{hs.Count}";
相关问题