我在VB页面中有一个包含批量数据的数据表。在该数据表中,一列命名为vType,该列中的值是Pr定义的值之一,如'A','B','C', 'D'等,来自一个Datable。 现在我想要最后计算每种类型。 例如:CountA = 20,CountB = 25,依此类推。
到目前为止,我已使用If条件(静态
)比较了每个值For each dr as dataRow in dsType.rows
If dr("vType") = 'A' Then
CountA += 1
ElseIf dr("vType") = 'B' Then
CountB +=1
Next dr
并且这个if条件将重复取决于该数据表中的类型没有(最多8个固定值)我想在单个if条件下执行此操作(如果可能,则为Dynamic)我可以计算这些值并将其存储为单个值varaible?感谢您及时回复。
答案 0 :(得分:1)
您可以在每个群组中使用Linq-To-DataSet
和Enumerable.GroupBy
+ Enumerable.Count
:
Dim typeGroups = dsType.AsEnumerable().
GroupBy(Function(row) row.Field(Of String)("vType")).
Select(Function(g) New With{ .Type = g.Key, .Count = g.Count(), .TypeGroup = g })
请注意New With
在VB.NET中使用自定义属性创建匿名类型。所以就像你可以在当前方法中使用的 on the the-fly 类。
现在,您可以使用For Each
枚举查询:
For Each typeGroup In typeGroups
Console.WriteLine("Type:{0} Count:{1}", typeGroup.Type, typeGroup.Count)
Next
我不能使用Linq,我只需要使用简单的vb
然后使用Dictionary
:
Dim typeCounts = New Dictionary(Of String, Integer)
For Each row As DataRow In dsType.Rows
Dim type = row.Field(Of String)("vType")
If (typeCounts.ContainsKey(type)) Then
typeCounts(type) += 1
Else
typeCounts.Add(type, 1)
End If
Next
现在您有一个字典,其中键是类型,值是具有此类型的行的计数。
答案 1 :(得分:0)
为什么不从db本身获取假装结果? 像这样:
select count(*), vType
from someTable
group by vType
答案 2 :(得分:0)
对你的问题不太确定..但这是我考虑过的......
您可以将其设为Sub ..
Sub AssignIncr(ByVal ds as DataSet,byval sFi as String,byval sCrit as String,ByRef Counter as Integer)
For each dr as dataRow in ds.rows
If dr(sFi) = sCrit Then Counter += 1
Next dr
End Sub
所以你可以通过..
来使用它AssignIncr(dsType,"vType","A",CountA)