在数据表中订购列

时间:2013-05-02 16:04:21

标签: vb.net

所以,我有这个函数,它接受一个数据表并按两列对用户进行排序。 (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 

2 个答案:

答案 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个中的一个。