2013-05-02 6 views
1

그래서이 함수는 데이터 테이블을 가져 와서 두 개의 열로 사용자를 정렬합니다. (순위 및 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)와 최저 인 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

'username, amount'이 (가) 선언 된 변수는 무엇입니까? –

+0

아, 그저 단순화했습니다. 나는 그걸 테이블에서 잡아 올거야. 나는 그 포스트를 편집 할 것이다. – MaylorTaylor

+0

OrderCount가 텍스트 값일 수 있습니까? 텍스트를 정렬 할 때 (어휘 정렬), 15는 5보다 작지만 문자 단위로 보이고 첫 번째 차이에서 결과를 반환합니다. –

답변

0

숫자 값 대신 문자열 값으로 OrderCount를 처리하는 것으로 보이므로 숫자 값 대신에 어휘 적으로 정렬합니다. 컬럼 유형은 무엇입니까?

두 자리 숫자를 얻기에 충분한 순위를 얻으면 순위 열과 동일한 문제가 발생합니다.

또한, 두 번째 블록에서 예를 들어, # 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()"행을 얻으면 "Rank = row.Field (Int32) (0)"로 다시 이동 한 다음 "지정된 캐스트가 유효하지 않습니다."오류가 발생합니다. ? ? ? – MaylorTaylor

+0

기둥 유형은 무엇입니까? 나는 Rank와 OrderCount가 정수라고 추정했다. 문자열 인 경우 문자열로 캐스팅 한 다음 'Int32.Parse'를 사용해야합니다. 'Field' 메쏘드는 강하게 타이핑됩니다. 또한 "delete-row"논리를 고려하여 첫 번째 버전에서와 같이 서수 대신 열 이름을 사용하도록 내 대답을 편집했습니다. –