2013-05-13 60 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