我有一个数据表,它有一个单一的文本列“标题”,它可以有多个重复的值。我可以使用数据视图删除重复项。从数据表中获取每个不同值的重复计数
DataView v = new DataView(tempTable);
tempTable = v.ToTable(true, "Title");
但是我怎样才能得到没有任何循环的每个不同值的重复次数?
我有一个数据表,它有一个单一的文本列“标题”,它可以有多个重复的值。我可以使用数据视图删除重复项。从数据表中获取每个不同值的重复计数
DataView v = new DataView(tempTable);
tempTable = v.ToTable(true, "Title");
但是我怎样才能得到没有任何循环的每个不同值的重复次数?
如果你不想循环或使用Linq,所以没有办法做到这一点,但是如果适用于你,你可以在数据表上使用一个计算列。这是数据应该在这样的两个相关表中。
DataRelation rel = new DataRelation("CustToOrders", data.Tables["Customers"].Columns["customerid"], data.Tables["Orders"].Columns["customerid"]);
data.Relations.Add(rel);
鉴于customerid字段作为Orders表中的外键,因此它具有重复项。 你可以这样得到重复次数:
data.Tables["Customers"].Columns.Add("Duplicates",
GetType(Decimal), "Count(child.customerid)");
的方式,我会得到你想要看起来像这样的结果:
tempTable.Rows.Cast<DataRow>()
.Select(dr => Convert.ToString(dr[0]))
.GroupBy(dr => dr)
.Select(g => new { Title = g.Key, Count = g.Count() });
但是,它实际上是引擎盖下循环。事实上,我无法想象如何在不检查每条记录的情况下进行这种分组。
缺点是该表达式的结果是一系列匿名类型实例。如果您仍然希望结果是DataView,那么您可以重写最后一个Select以创建具有两列的新DataRow,并将它们推送到传递给DataView的新DataTable中。
我不幸地使用Linq。 – NLV 2010-08-08 14:54:13
你可以用'tempTable.AsEnumerable()'替换'tempTable.Rows.Cast()' –
2010-08-09 11:58:35