2013-05-13 79 views
4

在项目中我有一个外部枚举(从服务引用生成)。 所以我不能改变枚举值。比较排序的枚举值

我该如何比较这些枚举值与对方有效的方式?

这里枚举

public enum Values 
{ 
    A, 
    B, 
    C, 
    D, 
    E, 
    F, 
    G, 
    H 
} 

而且排序顺序,我希望他们的例子是不一样的(像F,H,A,C,B,...)

眼下我有一些比较的扩展方法。 (具有顺序我不想再枚举)

public static int CompareTo(this Values x, Values y) 
    { 
     var orderedX = GetOrderedValues(x); 
     var orderedY = GetOrderedValues(y); 

     return orderedX.CompareTo(orderedY); 
    } 


internal enum ValuesOrdered 
{ 
    F = 0, 
    H = 1, 
    C = 2, 
    D = 3, 
    B = 4, 
    A = 5, 
    E = 6, 
    G = 7 
} 

internal static ValuesOrdered GetOrderedValues(this Values x) 
{ 
    switch (x) 
    { 
     case Values.A: 
     { 
      return ValuesOrdered.A; 
     } 

     // and so on... 
    } 
} 

才能实现这一目标更有效?

+0

你的方法似乎是合理的。当你无法控制源值时,有时你必须得到一个不太理想的解决方案。 – dlev 2013-05-13 08:33:05

+0

这种扩展方法有什么作用?你怎么使用它? 'CompareTo'有什么意义,为什么你会显示一个总是返回0的简单实现? – Jon 2013-05-13 08:38:02

+0

将尝试在编辑问题时回答您的问题。 – 2013-05-13 08:38:49

回答

2

如果你想要做的就是CompareTo,那么我认为你可以使用词典简化这个有点:

static Dictionary<Values, int> order = new Dictionary<Values, int> 
{ 
    {Values.A, 3}, 
    {Values.B, 5}, 
    {Values.C, 4}, 
    {Values.D, 6}, 
    {Values.E, 8}, 
    {Values.F, 1}, 
    {Values.G, 7}, 
    {Values.H, 2} 
}; 

public static int CompareTo(this Values x, Values y) 
{ 
    return order[x].CompareTo(order[y]); 
} 

然而,我不知道为什么要实现一个扩展方法命名为CompareTo,但我希望你不要期望它覆盖Enum.CompareTo。例如,

var values = Enum.GetValues(typeof(Values)).Cast<Values>().ToArray(); 
Array.Sort(values); 
Console.WriteLine(string.Join(" ", values)); 
//OUTPUT: A B C D E F G H 
+0

这也是一个非常好的主意。 – 2013-05-13 09:05:45

+0

其实我预计它会覆盖它。已经看到这不起作用,忘记了Enum。 :-( – 2013-05-13 10:16:59

+0

所有的答案都非常好,接受你的指示覆盖部分。 – 2013-05-13 10:19:33

4

我相信最简单的将是实现这种方式的对比功能:

public static int CompareTo(this Values x, Values y) 
{ 
    var sortOrder = new[] { 
     Values.F, 
     Values.H, 
     Values.C, 
     Values.D, 
     Values.B, 
     Values.A, 
     Values.E, 
     Values.G 
    }; 

    return Array.IndexOf(sortOrder, x) - Array.IndexOf(sortOrder, y); 
} 

当然你想移动的sortOrder初始化函数外,使其只运行一次。

关于选择数组作为编码所需排序的数据结构:它不仅是最简单的,而且对于如此少量的项目,线性搜索也可能是最快的。

+0

听起来很不错。它明确比另一个枚举更简洁! – 2013-05-13 09:04:43

2

而不是枚举ValuesOrdered使用静态只读排序列表(你可以不排序列表使用常数)这样的:

private static readonly SortedList<Values, int> ordered = new SortedList<Values, int> 
    { 
     {Values.F,0}, 
     {Values.H,1}, 
     {Values.C,2}, 
     {Values.D,3}, 
     {Values.B,4}, 
     {Values.A,5}, 
     {Values.E,6}, 
     {Values.G,7}, 
    }; 

和方法 “的CompareTo” 将是这样的:

public static int CompareTo(this Values x, Values y) 
    { 
     return Comparer<int>.Default.Compare(ordered[x], ordered[y]); 
    } 

享受! :-)

+0

这是我走的路。谢谢! – 2013-05-13 09:37:03