我有一個名爲「狀態」的字符串屬性的對象。我有這些對象的集合,並希望通過該字段是一個字符串來排序集合。如何可以按字符串屬性排序但不按字母順序排序
狀態的可能值是:
「打開」,「關閉」,「待定」,所以我不能使用字母順序。說「開放」大於「封閉」大於「待定」的最佳方式是什麼?
我知道有一個IComparer接口,但我想看看最優雅的方式來定義各種字符串的順序。
我有一個名爲「狀態」的字符串屬性的對象。我有這些對象的集合,並希望通過該字段是一個字符串來排序集合。如何可以按字符串屬性排序但不按字母順序排序
狀態的可能值是:
「打開」,「關閉」,「待定」,所以我不能使用字母順序。說「開放」大於「封閉」大於「待定」的最佳方式是什麼?
我知道有一個IComparer接口,但我想看看最優雅的方式來定義各種字符串的順序。
如何使用枚舉而不是字符串?
public enum Status
{
Pending,
Closed,
Open
}
然後打開>關閉>待
您還可以使用喬恩斯基特的回答你的字符串轉換爲一個枚舉,如果你不能改變你返回字符串的事實。
我會創建一個一些形式的映射,從字符串到一些自然排序的值(如整數)。
然後你可以使用:
var sorted = unsorted.OrderBy(x => ConvertStatusToInt32(x.Status));
的轉換方法可以使用一個靜態初始化Dictionary
,或交換機,或什麼的。
(您可能要考慮使用一個枚舉,順便說一句 - 您的原始狀態最好這樣,你不需要依靠串在所有。)
您可以在這裏定義的順序:
string[] bestOrder = new string[] { "Open", "Closed", "Pending" };
然後排序(即IndexOf
)所討論的字符串中bestOrder
索引。
根據你如何排序代碼會有所不同..但代表做x => bestOrder.IndexOf(x)
或類似的可能是你想要的。
然後我會如何在比較中使用它? – leora
你不需要。做'list.OrderBy(x => bestOrder.IndexOf(x));'就是這樣 –
如果它是一個靜態的有限選項集合,您可以用枚舉替換字符串並對枚舉的整數值進行排序。
我認爲你的問題在於你試圖強制語義上的字符串類。如果我是你,我會創造我自己的狀態對象:
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.
}
}
也許使用由@Yuf在他的回答提供作爲地圖的枚舉,然後在地方ConvertStatusToInt32的使用enum.Parse()? –
@Steve:我可能會自己使用Unconstrained Melody,但'enum.Parse'也會這樣:)儘管更改屬性類型會更好... –