当我声明枚举时,我经常添加一个NOT_SET = 0值来知道实例何时尚未初始化.当我枚举这种枚举的值时(如此处和此处所述),丢弃NOT_SET值的最佳方法是什么?我能想到的最好的是
Enum.GetValues(typeof(T)).Cast<int>().Where(item => (0 != (int)item)).Cast<T>();
Run Code Online (Sandbox Code Playgroud)
我不喜欢它,因为与所有那些Cast <>的迭代太多了.我更喜欢基于的东西
(T[]) Enum.GetValues(typeof(T))
Run Code Online (Sandbox Code Playgroud)
没有所有的Cast <>.
目前尚不清楚为什么你还有两个 Cast<T>电话,但这很容易分两步完成:
var allValues = (T[]) Enum.GetValues(typeof(T));
var allButDefault = allValues.Except(Enumerable.Repeat(default(T), 1));
Run Code Online (Sandbox Code Playgroud)
Except假设默认比较器做正确的事情,在这里使用避免装箱.请注意,它需要构建一个集合,因此您可能最好使用我的原始代码:
var allValues = (T[]) Enum.GetValues(typeof(T));
var allButDefault = allValues.Where(t => !t.Equals(default(T)));
Run Code Online (Sandbox Code Playgroud)
或者使用默认的相等比较器T:
var allValues = (T[]) Enum.GetValues(typeof(T));
var comparer = EqualityComparer<T>.Default;
var allButDefault = allValues.Where(t => !comparer.Equals(t, default(T)));
Run Code Online (Sandbox Code Playgroud)
请注意,所有这些都将处理非int基础枚举.
您可能还想查看我的无约束旋律项目,该项目建立在实际约束T为枚举的基础上.
您可以使用各种选项来获得更高的性能,避免每次都创建数组等.我们不知道这段代码的性能如何,所以我没有详细介绍.
| 归档时间: |
|
| 查看次数: |
187 次 |
| 最近记录: |