我如何按字符串属性排序,但不按字母顺序排序

时间:2011-07-29 13:53:17

标签: c# compare

我有一个具有名为“Status”的字符串属性的对象。我有这些对象的集合,并希望按该字段订购一个字符串集合。

状态的可能值为:

“打开”,“关闭”,“等待”,所以我不能使用字母顺序。说“开放”大于“已结束”的最佳方式是什么?大于“待定”?

我知道有一个IComparer<>界面,但我希望看到最优雅的方式来定义各种字符串的顺序。

5 个答案:

答案 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)

如果它是一个静态有限的选项集合,你可以用枚举替换字符串,并对枚举的整数值进行排序。