如何计算在列“”中具有值的行数;A”;,但是在列“”中具有不同的值;B”;使用Linq
本文关键字:Linq 使用 何计算 计算 | 更新日期: 2023-09-27 18:29:19
Sry英语不好。。。
DataTable示例
| ID_UEH | ID_F |
|......1......|...10...|
|......1......|...11...|
|......2......|...10...|
|......2......|...12...|
|......3......|...10...|
|......3......|...13...|
我想制作一个函数,检查是否有符合以下规范的行:
-列"ID_UEH"中的值不同,但值相同在列"ID_F"中
我试过这个:
(from rowA in DataTableA.Select()
join rowB in DataTableA.Select()
on rowA["ID_F"] equals rowB["ID_F"]
where rowA["ID_UEH"] != rowB["ID_UEH"]).Count()
代码返回0
然后我试试这个:
(from rowA in DataTableA.Select()
join rowB in DataTableA.Select()
on rowA["ID_F"] equals rowB["ID_F"]
where rowA["ID_UEH"] != rowB["ID_UEH"] &&
rowA["ID_F"] == rowB["ID_F"]).Count()
代码返回6(DataTableA.Rows.Count=6)
然后他们让我快点,我照做了:
int numRows = 0;
foreach (DataRow rowA in DataTableA.Select())
{
numRows = tabela.Select(
"ID_UEH <> "+Convert.ToInt32(rowA["ID_UEH"]) + " AND " +
"ID_F= " + Convert.ToInt32(rowA["ID_F"])
).Length;
if (numRows > 1)
break;
}
代码返回我想要的。
我的问题是,我做错了什么?
连接不起作用的原因是:您正在连接同一个表,因此您得到12行(6+6行,并且所有行都有一个具有相同ID_UEH
值的"对应行")。因此,3的正确结果也是加倍的。
编辑:我想这就是你所需要的,比我下面的第一种方法更可读:
var rows = dataTableA.AsEnumerable();
int count = rows.Count(r1 => rows
.Any(r2 => r1.Field<int>("ID_F") == r2.Field<int>("ID_F")
&& r1.Field<int>("ID_UEH") != r2.Field<int>("ID_UEH")));
这是LINQ,它会给你正确的结果。然而,它不是很可读:
int count = dataTableA.AsEnumerable()
.GroupBy(r => r.Field<int>("ID_F"))
.Sum(g =>
{
if (g.Count() == 1)
return 0;
var allIDUEH = g.Select(r => r.Field<int>("ID_UEH"));
return allIDUEH.Count(ueh1 => allIDUEH.Any(ueh2 => ueh1 != ueh2));
});
坚持你的循环。。。。如果它有效,因为它所做的事情与您所描述的不同
var c = DataTableA.AsEnumerable()
.GroupBy(r=>r.Field<int>("ID_F"))
.Where(g=>g.Count()>1 &&
g.GroupBy(r=>r.Field<int>("ID_UEH"))
.Where(a=>a.Count()>1).Count() > 1)
.Count();
尝试以下操作:
var q = (from r in DataTableA.AsEnumerable()
group r by r.Field<int>("ID_F") into gr
let count = gr.Select(g => g.Field<int>("ID_UEH")).Distinct().Count()
select count > 1 ? count : 0).Sum();