枚举可以有一个分配给它们的整数值(有些人可能称之为“序数”)。你可以通过强制转换得到这个整数值。
int valueOfEnum = (int)SomeEnum.SomeEnumValue;
在您的情况下,您没有分配整数值,这很好。如果您不分配它们,那么 C# 会自动为您分配它们。它们从0 开始,然后从那里递增。
这里是the MSDN documentation on using these enum "values"。
您可以按照您希望它们出现的顺序将这些项目放入您的enum SomeAction 定义中,并让C# 自动分配这些值。这可能就是您需要做的所有事情。
您还可以为它们中的每一个分配值,以指定您喜欢的顺序。如果您想以不同的顺序声明它们,这会有所帮助。
public enum SomeAction
{
Read = 1,
Create = 3,
Update = 2, // Update should come before Create in my list, so I give it a lower value
// ...
如果您想按组对操作进行排序,您可以使用这种手动分配技术来分配重复值(可能是Archive = 1 和Update = 1)。
现在您已经有了比较列表中项目的基础,有几种方法可以确保它们是有序的:
只需排序
确保约束的一个好方法是自己完成工作。排序它,它就会被排序:)
这只适用于if your sorting function produces a stable sort。 documentation on MSDN says OrderBy does stable sorting 所以你用这个方法就好了。
只有在您有能力重新订购列表中的项目时,它才会起作用。从您的操作的定义(每个操作都依赖于先前状态的操作列表)来看,我不确定这是不是真的。您可能需要选择其他方法之一来检查订单。
var sortedList = yourList.OrderBy(item => (int)item.Action).ToList();
将列表与自身的排序版本进行比较
如果您正在进行错误检查,但不想更正错误,这很有用。
此方法不会更改列表,因此对于您正在查看的操作类型可能是安全的。
var sortedList = yourList.OrderBy(item => (int)item.Action);
bool isSorted = Enumerable.SequenceEqual(yourList, sortedList);
手动编写比较算法
如果您需要严格控制内存分配和 CPU 使用率,这可能很有用。
您可能不需要这种级别的控制,除非您的列表非常大,或者您正处于高性能代码的紧密循环中(例如视频游戏绘制循环)。即使在这些情况下,您也可能需要考虑重构代码,以便此检查不会处于紧密循环的中间(如果可能的话)。
关于为什么我使用for 而不是foreach,请参阅 - In .NET, which loop runs faster, 'for' or 'foreach'?
// Note that you have to build a custom type for your list items to keep high performance,
// or write this inline instead of as a function, to avoid the perf hit of IList<dynamic>
bool IsMySpecificListTypeSorted(List<MyCustomListItemType> theList) {
int previousOrdinal = -1;
// Not using foreach because it is "8x slower" in tests
// and you're micro-optimizing in this scenario
for(int index = 0; index < theList.Count; ++index) {
var item = theList[index];
var currentOrdinal = (int)item.Action;
if(currentOrdinal < previousOrdinal) {
return false;
}
previousOrdinal = currentOrdinal;
}
return true;
}