目前尚不清楚为什么你有两个 Cast<T>
电话,但很容易分两步完成:
var allValues = (T[]) Enum.GetValues(typeof(T));
var allButDefault = allValues.Except(Enumerable.Repeat(default(T), 1));
假设默认比较器做正确的事情,在这里使用Except
可以避免装箱。请注意,它需要构建一个集合,因此使用我的原始代码可能会更好:
var allValues = (T[]) Enum.GetValues(typeof(T));
var allButDefault = allValues.Where(t => !t.Equals(default(T)));
或者使用默认的相等比较器T
:
var allValues = (T[]) Enum.GetValues(typeof(T));
var comparer = EqualityComparer<T>.Default;
var allButDefault = allValues.Where(t => !comparer.Equals(t, default(T)));
请注意,所有这些也将处理非int
基于枚举。
您可能还想看看我的Unconstrained Melody项目,它建立在实际约束T
为枚举的想法之上。
您可以使用各种选项来提高性能,避免每次都创建数组等。我们不知道这段代码对性能有多重要,所以我没有在这里详细介绍。