我想知道同时包含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计划?
答案 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;
}
当然,只有当核心功能变得比所描述的功能复杂一点时,才值得。