Vb.net 如何根据两列中的不同值从数据视图中获得正确的行数

Vb.net 如何根据两列中的不同值从数据视图中获得正确的行数,vb.net,Vb.net,我有一个数据视图,需要根据两列(比如ColumnA和ColumnB)的不同值的组合列表获取行数。我可以从这两列中获得不同值的字符串列表。我正在努力解决的部分是如何根据字符串列表中的每个项目从dataview中获得精确的行数(进入整数列表)。我认为问题在于ColumnB中可能不存在ColumnA的某些值,反之亦然。如果我应用基于ColumnA的行筛选器,可能会遗漏ColumnB中的某些值,这就是我执行以下操作的原因。但我最终在整数列表中得到了额外的计数。如果我不这样做,那么我就错过了一些值,从而导

我有一个数据视图,需要根据两列(比如ColumnA和ColumnB)的不同值的组合列表获取行数。我可以从这两列中获得不同值的字符串列表。我正在努力解决的部分是如何根据字符串列表中的每个项目从dataview中获得精确的行数(进入整数列表)。我认为问题在于ColumnB中可能不存在ColumnA的某些值,反之亦然。如果我应用基于ColumnA的行筛选器,可能会遗漏ColumnB中的某些值,这就是我执行以下操作的原因。但我最终在整数列表中得到了额外的计数。如果我不这样做,那么我就错过了一些值,从而导致合并总数低于行数

请告知。我需要使用字符串和Int值的最终列表创建一个基本表,然后在excel中创建一个图表

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