在项目中,我有一个外部枚举(从服务引用生成)。 所以我不能改变枚举值。
如何以有效的方式将这些枚举值相互比较?
这是枚举
的示例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 :(得分: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
的初始化移到函数外部,以便它只运行一次。
关于选择数组作为编码所需排序的数据结构:不仅是最简单的,而且对于这么少的项目,线性搜索也可能是最快的。
答案 1 :(得分: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的扩展方法,但我希望你不希望它覆盖{{1} }。例如,
Enum.CompareTo
答案 2 :(得分:2)
而不是枚举ValuesOrdered使用静态只读SortedList(你不能对SortedList使用常量),如下所示:
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]);
}
享受! : - )