2013-05-02 7 views
1

Итак, у меня есть эта функция, которая принимает данные и заказывает пользователей двумя столбцами. (Место и OrderCount)Порядок столбцов в datatable

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) и LOWEST OrderCount (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

Wehre являются переменными 'username, amount' decl? –

+0

О, я просто упростил их. Я хватаю их за стол. Я отредактирую сообщение. – MaylorTaylor

+0

Возможно ли, что OrderCount является текстовым значением? При сортировке текста (лексический сорт) 15 меньше 5, но он выглядит символом по символу и возвращает результат при первом различии. –

ответ

0

Похоже, что он обрабатывает ваш OrderCount как строку , а не числовое значение и, следовательно, сортирует его лексически вместо численного. Какой тип столбца?

У вас будет такая же проблема с вашим столбцом Rank, если вы получите достаточно рангов, чтобы добраться до двух цифр.

Кроме того, например, # 2 от вашего второго блока, то есть это:

#2 
Dane-R2/14 
Jerm-R2/15 
Kate- R2/15 
---picks Jerm (should pick Dane)

В этом случае Jerm является правильным выбором. Ранги все совпадают, и поэтому он попадает в столбец OrderCount, из которого он должен выбрать один из 15, если сортировка по убыванию.

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 
+0

Как только он попадает в строку «Dim BestChoice = bestchoice.First()», он возвращается к «Let Rank = row.Field (из Int32) (0)», а затем возникает ошибка «Указанный приведение недействительно». ? ? ? – MaylorTaylor

+0

Какой тип столбцов? Я предположил, что Rank и OrderCount являются целыми числами. Если они являются строками, вы должны направить их в строку, а затем использовать 'Int32.Parse'. Метод «Поле» строго типизирован. Я также отредактировал свой ответ, чтобы принять во внимание «delete-row» -logic и использовать имя столбца вместо его порядкового номера, как в моей первой версии. –

Смежные вопросы