2011-07-29 2 views
1

"상태"라는 문자열 속성이있는 개체가 있습니다. 나는이 객체들의 집합을 가지고 있고 그 필드에 의해 하나의 문자열 인 콜렉션을 정렬하고자한다. 상태의문자열 속성별로 정렬 할 수 있지만 알파벳순으로 정렬 할 수 없습니다.

가능한 값은 다음과 같습니다

"열기", "청산", "보류"그래서 내가 알파벳 순서를 사용할 수 없습니다. "Open"이 "Closed"보다 크고 "Pending"보다 더 낫다고 말하는 가장 좋은 방법은 무엇입니까?

IComparer <> 인터페이스가 있지만 다양한 문자열의 순서를 정의하는 가장 우아한 방법을 알고 싶습니다.

답변

3

문자열 대신 열거 형을 사용하는 것은 어떻습니까? 보류> 휴일 열기

 public enum Status 
    { 
     Pending, 
     Closed, 
     Open 
     } 

>

당신은 또한 당신이 문자열을 반환하고 있다는 사실을 변경할 수없는 경우, 열거로 문자열을 변환하는 존 소총의 답변을 사용할 수 있습니다.

1

일부 양식의 매핑을 문자열에서 자연스럽게 정렬 가능한 값 (예 : 정수)으로 만듭니다.

은 그럼 당신은 사용할 수 있습니다

var sorted = unsorted.OrderBy(x => ConvertStatusToInt32(x.Status)); 

변환 방법은 Dictionary 정적 초기화, 또는 스위치, 또는 무엇이든을 사용할 수 있습니다.

(당신은 방법에 의해, 열거를 사용하여 고려할 수 있습니다 - 이상적으로 원래의 상태를 전혀 문자열에 의존 할 필요가 없습니다 그 방법을..)

+0

은 어쩌면지도로 그의 대답에 @Yuf에서 제공하는 열거를 사용을 다음 ConvertStatusToInt32 대신에 enum.Parse()를 사용할 수 있습니까? –

+0

@Steve : 나는 아마도 Unconstrained Melody를 직접 사용 하겠지만, enum.Parse도 그렇게 할 것입니다. 그러나 속성 유형을 변경하는 것이 더 좋을 것입니다 ... –

0

당신이있어 순서를 정의 할 수 있습니다 :

string[] bestOrder = new string[] { "Open", "Closed", "Pending" }; 

그런 종류의 (즉 IndexOf) bestOrder에서 문제가되는 문자열의 인덱스에 의해.

정렬 방법에 따라 코드가 달라질 수는 있지만 x => bestOrder.IndexOf(x) 또는 그와 비슷한 비슷한 위임자가 원하는 것일 수 있습니다.

+0

어떻게 비교할 것인가? – leora

+0

필요가 없습니다. 'list.OrderBy (x => bestOrder.IndexOf (x)); '를 실행하면됩니다. –

0

정적 유한 컬렉션 옵션의 경우 문자열을 열거 형으로 대체하고 열거 형의 정수 값을 정렬 할 수 있습니다.

1

나는 여기서 문제는 문자열 클래스에 대한 의미를 강제하려는 것입니다. 내가 당신이라면, 내 자신의 상태 개체를 만들 것입니다 :

public class Status : IComparable 
{ 
    private string statusText_ = string.Empty; 
    private int priority_ = 0; 

    public class Status(string text, int priority) 
    { 
     statusText_ = text; 
     priority_ = priority; 
    } 

    // accessors ... 


    public int CompareTo(object o) 
    { 
      // add compare logic to compare priorities here. 
    } 
} 
관련 문제