如何在不复制元素的前提下,统计InlineArray中枚举值的出现次数?
解决InlineArray枚举值计数的CS0315问题
你遇到的问题根源是MemoryExtensions.Count<T>(Span<T>, T)的泛型约束要求T实现IEquatable<T>,而默认定义的枚举并未显式实现该接口,导致编译器触发CS0315错误。以下两种惯用方法可以解决这个问题,无需自行编写完整的计数逻辑:
方法1:让枚举显式实现IEquatable
直接修改枚举定义,让它实现IEquatable<Piece>接口。由于枚举的相等本质是底层整数值的比较,实现逻辑非常简单:
enum Piece : byte, IEquatable<Piece> { None = 0, White_Pawn = 1, White_Knight = 2, White_Bishop = 3, // 其他枚举值... public bool Equals(Piece other) { return this == other; } }
修改后,原代码中的board.Count(Piece.White_Pawn)就能正常编译运行,因为此时Piece满足了IEquatable<T>的约束。
方法2:使用带谓词的Count重载
不需要修改枚举,直接调用MemoryExtensions.Count<T>(Span<T>, Func<T, bool>)重载版本,传入判断相等的lambda表达式:
void Validate() { Span<Piece> board = Board; int whitePawnCount = board.Count(p => p == Piece.White_Pawn); // 无编译错误 Debug.Assert(whitePawnCount <= 8); // ... }
这个重载没有IEquatable<T>的约束,通过谓词实现元素匹配,完全利用现有框架方法完成计数,无需自行编写循环。
内容的提问来源于stack exchange,提问作者Pat Hensel
相关产品推荐
相关产品推荐

