我想知道是否有任何接口、模式或任何涉及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;
}
}
Run Code Online (Sandbox Code Playgroud)
计算是在一系列字节上进行的(即使有时我需要一个索引/随机访问流)。因此,序列可以是一个数组、它的一个片段或任何可枚举的源。
到目前为止,我无法找到一种体面的方法来概括方法签名(甚至接受一些重载作为转换),而无需实际分配数组或“重”的东西。
对即将到来的 .Net Standard 2.1 有什么计划吗?
到目前为止,这似乎是我发现的最不丑陋的解决方案:
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;
}
Run Code Online (Sandbox Code Playgroud)
当然,只有当核心功能变得比所描述的复杂一点时才值得。