2011-07-29 62 views
1

我有一個名爲「狀態」的字符串屬性的對象。我有這些對象的集合,並希望通過該字段是一個字符串來排序集合。如何可以按字符串屬性排序但不按字母順序排序

狀態的可能值是:

「打開」,「關閉」,「待定」,所以我不能使用字母順序。說「開放」大於「封閉」大於「待定」的最佳方式是什麼?

我知道有一個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. 
    } 
}