2014-10-06 5 views
1

Inspector와 InspectorRates의 두 가지 일반 목록이 있습니다. Inspector 클래스에는 Inspector Rate 클래스의 객체가 있습니다.여러 값과 특정 값에 대한 IComparer

enter image description here

요율 유형은 (선택하지 않음 = 0, 1 = 일을 평가, 2 = 시간별 요금) 세 가지 다른 값이 있습니다.

enter image description here

나는 모든 첫날 종류 요금으로 검사 한 후 가장 낮은 비율을 보여주고 싶어요. 사용자가 "시간별 요율"옵션을 선택하면 시간별 요율 및 최저 요율로 목록을 정렬해야합니다. 선택되지 않은 요율은 항상 하단에 표시됩니다.

예 : 정렬 후, 목록의 내용이 순서를 다음에 있어야합니다 (첫 번째 BYDAY이고, 두 번째는 시간입니다)

enter image description here

내가 정렬 IComparer 클래스를 만들 수 있지만 수 없습니다 특정 및 여러 필드를 기반으로 목록을 정렬하는 방법을 알아보십시오.

Public Class InspectorSort 
    Implements IComparer(Of Inspector) 
    Private listOrderBy As OrderBy = OrderBy.FirstName 
    Private listDirection As Direction = Direction.Assending 

    Public Enum OrderBy As Byte 
     InspectorID = 0 
     FirstName = 2 
     DayRate = 14 
     HourlyRate = 15 
    End Enum 

    Public Enum Direction As Integer 
     Assending = 1 
     Decending = -1 
    End Enum 

    Public Sub New(ByVal mOrderBy As OrderBy, ByVal mDirection As Direction) 
     listOrderBy = mOrderBy 
     listDirection = mDirection 
    End Sub 

    Public Function Compare(ByVal x As Objects.Inspector, ByVal y As Objects.Inspector) As Integer Implements System.Collections.Generic.IComparer(Of Objects.Inspector).Compare 
     Dim value As Integer = 0 

     Select Case listOrderBy 
      Case OrderBy.InspectorID 
       If x.InspectorID > y.InspectorID Then 
        value = 1 
       ElseIf x.InspectorID < y.InspectorID Then 
        value = -1 
       End If 

      Case OrderBy.FirstName 
       If x.FirstName.ToLower > y.FirstName.ToLower Then 
        value = 1 
       ElseIf x.FirstName.ToLower < y.FirstName.ToLower Then 
        value = -1 
       End If 

      Case OrderBy.DayRate 
       If x.DefaultRate.RateType = Rates.RateTypeEnum.Day_Rate Then 
        If x.DefaultRate.RateType = Rates.RateTypeEnum.Day_Rate And x.DefaultRate.Rate > y.DefaultRate.Rate Then 
         value = 1 
        End If 

     End Select 

     Return value * listDirection 
    End Function 
End Class 

답변

0

나는 VB로 번역하는 데 시간이 걸리지 않았지만, 이것은 내가 만든 C# Comparer을 기반으로합니다.

업데이트 된 코드

 // RateType 0 always greatest of list 
     if (x.DefaultRate.RateType == 0)   
      return 1; 

가끔은 당신이 원하는 값을 갖는 y를 이것은 고려하지 않았다

원. y를 반환 값에 대한 추가 검사가 따라

는 그래서이 얻을 당신이 가까이 당신이 원하는 곳으로 얻을해야

 // RateType 0 always greatest of list 
     if (x.DefaultRate.RateType == 0)   
      return 1; 
     else if (y.DefaultRate.RateType == 0) 
      return -1; 



public class InspectorDayRateComparer : IComparer<Inspector> 
{ 
    public int Compare(Inspector x, Inspector y) 
    { 
     // RateType 0 always greatest of list 
     if (x.DefaultRate.RateType == 0)   
      return 1; 
     else if (y.DefaultRate.RateType == 0) 
      return -1; 

     int result = x.DefaultRate.RateType.CompareTo(y.DefaultRate.RateType); 
     if (result == 0) 
      result = x.DefaultRate.Rate.CompareTo(y.Defaultrate.Rate); 

     return result; 
    } 
} 

public class InspectorHourlyRateComparer : IComparer<Inspector> 
{ 
    public int Compare(Inspector x, Inspector y) 
    { 
     // RateType 0 always greatest of list 
     if (x.DefaultRate.RateType == 0)   
      return 1; 
     else if (y.DefaultRate.RateType == 0) 
      return -1; 

     // So that 1 is greater than 2 to get the order desired     
     int result = (x.DefaultRate.RateType.CompareTo(y.DefaultRate.RateType) *-1) ; 
     if (result == 0) 
      result = x.DefaultRate.Rate.CompareTo(y.Defaultrate.Rate;       
    } 
} 

된다.

IComparer 인터페이스 here

당신이 그들을 결과 변수를 사용하여 체인의 비교에 추가 더 많은 요소가있는 경우, 결과 == 0 값이 동일한 것을, 우리가 비교 자에 대한 다른 속성을 확인해야 함을 의미합니다.

RateType이없는 경우 항상 마지막으로 설정됩니다.

+0

답장을 보내 주셔서 감사합니다 :) 나는 거의 다 왔어. 1,2,0 형식으로 정렬하려면 논리를 어떻게 적용할까요? 따라서 RateType 1은 오름차순으로, 그 다음은 오름차순으로 2와 함께 0 – user1263981

+0

그냥 코드를 테스트하고 편집을 참조하십시오. 테스트되지 않은 sry가 있어야합니다. – CheGueVerra

관련 문제