Vb.net 如何根据两列中的不同值从数据视图中获得正确的行数
我有一个数据视图,需要根据两列(比如ColumnA和ColumnB)的不同值的组合列表获取行数。我可以从这两列中获得不同值的字符串列表。我正在努力解决的部分是如何根据字符串列表中的每个项目从dataview中获得精确的行数(进入整数列表)。我认为问题在于ColumnB中可能不存在ColumnA的某些值,反之亦然。如果我应用基于ColumnA的行筛选器,可能会遗漏ColumnB中的某些值,这就是我执行以下操作的原因。但我最终在整数列表中得到了额外的计数。如果我不这样做,那么我就错过了一些值,从而导致合并总数低于行数 请告知。我需要使用字符串和Int值的最终列表创建一个基本表,然后在excel中创建一个图表Vb.net 如何根据两列中的不同值从数据视图中获得正确的行数,vb.net,Vb.net,我有一个数据视图,需要根据两列(比如ColumnA和ColumnB)的不同值的组合列表获取行数。我可以从这两列中获得不同值的字符串列表。我正在努力解决的部分是如何根据字符串列表中的每个项目从dataview中获得精确的行数(进入整数列表)。我认为问题在于ColumnB中可能不存在ColumnA的某些值,反之亦然。如果我应用基于ColumnA的行筛选器,可能会遗漏ColumnB中的某些值,这就是我执行以下操作的原因。但我最终在整数列表中得到了额外的计数。如果我不这样做,那么我就错过了一些值,从而导
For x As Integer = 0 To DistinctColValueList.Count - 1
'' OR Condition Below Gives more count
'Dv.RowFilter = "ColumnA = '" & DistinctColValueList.ElementAt(x) & "' OR ColumnB = '" & DistinctColValueList.ElementAt(x) & "'"
Dv.RowFilter = "ColumnA = '" & DistinctColValueList.ElementAt(x) & "'"
DistinctIntValueList.Add(Dv.Count)
Next
Dim ClonedList As New List(Of Integer)
For Each item In DistinctIntValueList
ClonedList.Add(item)
Next
Dv.RowFilter = ""
DistinctIntValueList.Clear()
For y As Integer = 0 To DistinctColValueList.Count - 1
Dv.RowFilter = "ColumnB = '" & DistinctColValueList.ElementAt(y) & "'"
Dim Abs_Diff = Math.Abs(ClonedList.ElementAt(y) - Dv.Count)
DistinctIntValueList.Add(ClonedList.ElementAt(y) + Abs_Diff)
Next
更新:添加了示例表
+-----------------------------+
|Item |Column_A |Column B |
| | | |
+-----------------------------+
| XYZ1 | Loc1 | Loc5 |
| XYZ2 | Loc13 | Loc6 |
| XYZ3 | Loc4 | Loc4 |
| XYZ4 | Loc6 | Loc10 |
| XYZ5 | Loc5 | Loc2 |
| XYZ6 | Loc5 | Loc6 |
| XYZ7 | Loc6 | Loc9 |
| XYZ8 | Loc4 | Loc10 |
| XYZ9 | Loc6 | Loc13 |
| XYZ10 | Loc2 | Loc10 |
+--------+----------+---------+
您的问题的一个解决方案是计算A列和B列中的值,其中AB,然后计算相同的值并进行计数 使用提供的DataTable,我编写了以下内容。它还具有一次获得不同值和计数的优点
Dim dt As New DataTable("Test")
dt.Columns.Add("Item", "".[GetType]())
dt.Columns.Add("Column_A", "".[GetType]())
dt.Columns.Add("Column_B", "".[GetType]())
dt.Rows.Add("XYZ1", "Loc1", "Loc5")
dt.Rows.Add("XYZ2", "Loc13", "Loc6")
dt.Rows.Add("XYZ3", "Loc4", "Loc4")
dt.Rows.Add("XYZ4", "Loc6", "Loc10")
dt.Rows.Add("XYZ5", "Loc5", "Loc2")
dt.Rows.Add("XYZ6", "Loc5", "Loc6")
dt.Rows.Add("XYZ7", "Loc6", "Loc9")
dt.Rows.Add("XYZ8", "Loc4", "Loc10")
dt.Rows.Add("XYZ9", "Loc6", "Loc13")
dt.Rows.Add("XYZ10", "Loc2", "Loc10")
'get a collection where A <> B
Dim diff = dt.AsEnumerable().Where(Function(x) x.Field(Of String)("Column_A") <> x.Field(Of String)("Column_B"))
'get a concat of A and B where A<>B and concat where A=B
Dim concat = diff.[Select](Function(x) x.Field(Of String)("Column_A")) _
.Concat(diff.[Select](Function(x) x.Field(Of String)("Column_B"))) _
.Concat(dt.AsEnumerable() _
.Where(Function(x) x.Field(Of String)("Column_A") = x.Field(Of String)("Column_B")) _
.[Select](Function(x) x.Field(Of String)("Column_A")))
'Group by to get the counts
Dim result = concat.GroupBy(Function(value) value).[Select](Function(group) New With { _
Key .Value = group.Key, _
Key .Count = group.Count() _
})
Console.WriteLine("Value | Count")
For Each x In result
Console.WriteLine("{0} | {1}", x.Value, x.Count)
Next
不确定我是否正确理解了如何获得不同的值,但我会添加一个新的计算列(请参见DataColumn.Expression),它是第一列与第二列的串联。在这一点上,distinct在计算的column@Steve我不认为那是OP想要的。假设下面的集合
{{steve,steve},{steve,jon},{dave,steve}}
我相信OP想要{{steve,3},{jon,1},{dave,1}
连接不会有帮助。两列的并集可以做到这一点,例如dv.Select(ColA).union(dv.Select(ColB)
感谢您的回复。我在原始帖子中添加了一个示例表图像。正如您所看到的,列A中的一些值可能不在列B中。我过去从两列中获取不同值的列表。现在我有了字符串列表(这些不同的价值观),我需要对上表应用这些作为过滤器,以获得每个值的行数。现在,a列中的值可以在B列中重复,反之亦然。我希望这更清楚。Conrad,我尝试了你的方法,但我得到了更多的行数。这是我正在努力的地方。@DK2014 Union无法工作,因为它有一个distinct。你需要使用con猫看我的回答谢谢康拉德。非常感谢你的帮助。我能给你发一张实际的桌子吗?我希望你能解释一下为什么我的答案对你没有帮助。这样我可以改进我的答案,希望能更好地帮助和你尝试同样事情的人。我想你的答案给了我正确的方向。我不确定我是否能帮上忙这里是er表?但我会尝试。它大约有120行。这样我可以确定我没有做错任何事情。我想我现在已经理解了它的工作原理。虽然您可能有10行,但列A和B中的值可能会重复,因此您将得到比实际行更高的总计数。这是正确的,因为它实际上告诉您有多少列A和Br B值存在于表中,给出了一个整体数字。积极的一面是,如果一个项目在表B中,而不是在A中,那么它不会被忽视。这是我的主要意图。非常感谢Conrad。。
Value | Count
Loc1 | 1
Loc13 | 2
Loc6 | 5
Loc5 | 3
Loc4 | 2
Loc2 | 2
Loc10 | 3
Loc9 | 1