我需要计算除重复行之外的一列行
门牌号码 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}";
我尝试了上面的代码,但预期会有错误标识符。
答案 0 :(得分:1)
您的代码有一些潜在的问题,但让我们从阻止其编译的问题入手。
if ((string)dataGridView1.Rows.[row].Cells("House_Number").Distinct())
这里有一个有问题的地方是Rows.[row]
。那里不应该有一段时期。如果您有一个这样的时期,C#会期望一个标识符跟随它,而不是另一个运算符。在这种情况下,您必须使用[]
运算符,该运算符无效。它应该看起来像这样:
if ((string)dataGridView1.Rows[row].Cells("House_Number").Distinct())
我们越来越近了。但是,if
语句中的测试必须求值为bool
或true
的{{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()
遍历以下内容:
int houses = dataGridView1.Rows
.Cast<DataGridViewRow>()
.Select(r => (int)r["House_Number"].Value)
.Distinct()
.Count();
开始。dataGridView1
行:DataGridViewCellCollection
.Rows
很老,因此它实现了DataGridViewCellCollection
而不是IEnumerable
。我们需要将其转换为IEnumerable<DataGridViewRow>
,因此我们将其称为LINQ的IEnumerable<DataGridViewRow>
。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
(int)
变成另一个只有不同值的IEnumerable<int>
.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}";