ReadOnlySpan <T>和IReadOnlyList <T>之间是否有任何公共接口?

时间:2019-08-20 05:32:10

标签: c# .net-core-3.0

我想知道同时包含ReadOnlySpan<T>IReadOnlyList<T>(还有更通用的接口)时是否存在任何接口,模式或其他内容,您希望避免无用的分配

使用IEnumerable<T>考虑此方法,但不介意实际功能:

    public byte Compute(IEnumerable<byte> buffer)
    {
        unchecked
        {
            byte lrc = 0;
            foreach (byte cell in buffer)
            {
                lrc ^= cell; //just an example
            }
            return lrc;
        }
    }

计算是按字节序列进行的(即使有时我需要索引/随机访问流)。因此,序列可以是一个数组,该数组的一个片段或任何可枚举的源。

到目前为止,我还没有找到一种体面的方法来概括方法签名(甚至接受一些重载作为转换),而没有实际分配一个数组或一些“重载”的东西。

是否有任何东西,甚至还没有为即将推出的.Net Standard 2.1计划?

1 个答案:

答案 0 :(得分:0)

到目前为止,这似乎是我找到的最丑陋的解决方案:

    public byte Compute(IEnumerable<byte> buffer)
    {
        unchecked
        {
            byte lrc = 0;
            foreach (byte cell in buffer)
            {
                this.ComputeCore(ref lrc, cell);
            }
            return lrc;
        }
    }


    public byte Compute(ReadOnlySpan<byte> span)
    {
        unchecked
        {
            byte lrc = 0;
            foreach (byte cell in span)
            {
                this.ComputeCore(ref lrc, cell);
            }
            return lrc;
        }
    }

    private void ComputeCore(ref byte acc, byte cell)
    {
        acc ^= cell;
    }

当然,只有当核心功能变得比所描述的功能复杂一点时,才值得。