我有一个具有名为“Status”的字符串属性的对象。我有这些对象的集合,并希望按该字段订购一个字符串集合。
状态的可能值为:
“打开”,“关闭”,“等待”,所以我不能使用字母顺序。说“开放”大于“已结束”的最佳方式是什么?大于“待定”?
我知道有一个IComparer<>界面,但我希望看到最优雅的方式来定义各种字符串的顺序。
答案 0 :(得分:3)
如何使用枚举而不是字符串?
public enum Status
{
Pending,
Closed,
Open
}
然后打开>已关闭>未决
如果你不能改变你正在返回字符串的事实,你也可以使用Jon Skeet的答案将你的字符串转换为枚举。
答案 1 :(得分:1)
我会创建某些形式的映射,从字符串到一些自然可排序的值(例如整数)。
然后你可以使用:
var sorted = unsorted.OrderBy(x => ConvertStatusToInt32(x.Status));
转换方法可能会使用静态初始化的Dictionary
或开关,或其他任何内容。
(顺便说一句,您可能需要考虑使用枚举 - 最好是原始状态。这样您根本不需要依赖字符串。)
答案 2 :(得分: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.
}
}
答案 3 :(得分:0)
您可以在此处定义订单:
string[] bestOrder = new string[] { "Open", "Closed", "Pending" };
然后按IndexOf
中所讨论的字符串(即bestOrder
)的索引排序。
根据您的排序方式,代码会有所不同..但是x => bestOrder.IndexOf(x)
或类似的委托可能就是您想要的。
答案 4 :(得分:0)
如果它是一个静态有限的选项集合,你可以用枚举替换字符串,并对枚举的整数值进行排序。