You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不复制元素的前提下,统计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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 02:37:11