所以,我有这个函数,它接受一个数据表并按两列对用户进行排序。 (Rank和OrderCount)
Function DetermineBestUser(ByVal usertable As DataTable)
Dim bestchoice As DataRow()
For u = 0 To usertable.Rows.Count - 1
If Not DoesProcessorNeedOrders(usertable.Rows(u).Item("UserName"), usertable.Rows(u).Item("Amount")) Then
usertable.Rows(u).Delete()
End If
Next
bestchoice = usertable.Select("", "Rank ASC, OrderCount DESC")
If IsDBNull(usertable) Then
Console.WriteLine("No user is qualified for this order at this moment")
End If
Return bestchoice(0)(0).ToString
End Function
问题在于,有时这个功能正常工作,并为用户提供最高等级(1或2)和最低订单量(0 - 30+)。但是,有时它不会返回正确的人。我见过的唯一修复过的就是将“Ordercount DESC”改为“OrderCount ASC”;但是,此更改仅适用于该特定订单,然后又返回错误的人。
我有一些测试运行会更详细地显示这一点:R1& R2 =等级1或2 /“OrderCount”
Rank ASC, Ordercount ASC
#1
dane-R2 / 12
jerm-R1 / 15
tulsa-R1 / 5
---picks Jerm (should pick tulsa)
#2
Dane-R2 / 14
Jerm-R2 / 15
Kate- R2 / 15
---picks Dane
#3
Dane-R2 / 15
Jerm-R2 / 5
Kate-R2 / 5
---picks dane (should pick Jerm or Kate)
Rank ASC, Ordercount DESC
#1
dane-R2 / 12
jerm-R1 / 15
tulsa-R1 / 5
---picks Tulsa
#2
Dane-R2 / 14
Jerm-R2 / 15
Kate- R2 / 15
---picks Jerm (should pick Dane)
#3
Dane-R2 / 15
Jerm-R2 / 5
Kate-R2 / 5
---picks Jerm
答案 0 :(得分:0)
您可以使用Linq-To-DataSet
:
Dim bestChoices = From row In usertable.AsEnumerable()
Let Rank = row.Field(Of Int32)("Rank")
Let OrderCount = row.Field(Of Int32)("OrderCount")
Let UserName = row.Field(Of String)("UserName")
Let Amount = row.Field(Of Int32)("Amount")
Where Not DoesProcessorNeedOrders(UserName, Amount)
Order By Rank Ascending, OrderCount Descending
If bestChoices.Any() Then
Dim bestChoice = bestChoices.First()
Return String.Format("{0} {1} {2}", bestChoice.UserName, bestChoice.Rank, bestChoice, OrderCount)
Else
Return "No user is qualified for this order at this moment"
End If
答案 1 :(得分:0)
看起来它将OrderCount视为字符串值,而不是数字值,因此在词汇上而不是在数字上对其进行排序。该列的类型是什么?
如果排名达到两位数,你的Rank列会遇到同样的问题。
此外,例如你的第二个街区的#2,你有这个:
#2 Dane-R2 / 14 Jerm-R2 / 15 Kate- R2 / 15 ---picks Jerm (should pick Dane)
在这种情况下,杰姆是一个正确的选择。等级全部匹配,因此它属于OrderCount列,如果您按降序排序,它应从中选择15个中的一个。