我编写并使用以下扩展/工具方法来连接跨度:
ReadOnlySpan<T> otherSpan = ...
T[] someArray = ...
var myArray = someSpan.Concat(otherSpan, someArray, etc);
var myArray2 = SpanTool.Concat(someArray, otherSpan, etc);
SpanExtensions.cs
public static class SpanExtensions {
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T[] Concat<T>(this ReadOnlySpan<T> span0, ReadOnlySpan<T> span1)
=> SpanTool.Concat(span0, span1);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T[] Concat<T>(this ReadOnlySpan<T> span0, ReadOnlySpan<T> span1, ReadOnlySpan<T> span2)
=> SpanTool.Concat(span0, span1, span2);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T[] Concat<T>(this ReadOnlySpan<T> span0, ReadOnlySpan<T> span1, ReadOnlySpan<T> span2, ReadOnlySpan<T> span3)
=> SpanTool.Concat(span0, span1, span2, span3);
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static T[] Concat<T>(this ReadOnlySpan<T> span0, ReadOnlySpan<T> span1, ReadOnlySpan<T> span2, ReadOnlySpan<T> span3, ReadOnlySpan<T> span4)
=> SpanTool.Concat(span0, span1, span2, span3, span4);
}
SpanTool.cs
public static class SpanTool {
public static T[] Concat<T>(ReadOnlySpan<T> span0) {
var result = new T[span0.Length];
span0.CopyTo(result);
return result;
}
public static T[] Concat<T>(ReadOnlySpan<T> span0, ReadOnlySpan<T> span1) {
var result = new T[span0.Length + span1.Length];
var resultSpan = result.AsSpan();
span0.CopyTo(result);
var from = span0.Length;
span1.CopyTo(resultSpan.Slice(from));
return result;
}
public static T[] Concat<T>(ReadOnlySpan<T> span0, ReadOnlySpan<T> span1, ReadOnlySpan<T> span2) {
var result = new T[span0.Length + span1.Length + span2.Length];
var resultSpan = result.AsSpan();
span0.CopyTo(result);
var from = span0.Length;
span1.CopyTo(resultSpan.Slice(from));
from += span1.Length;
span2.CopyTo(resultSpan.Slice(from));
return result;
}
public static T[] Concat<T>(ReadOnlySpan<T> span0, ReadOnlySpan<T> span1, ReadOnlySpan<T> span2, ReadOnlySpan<T> span3) {
var result = new T[span0.Length + span1.Length + span2.Length + span3.Length];
var resultSpan = result.AsSpan();
span0.CopyTo(result);
var from = span0.Length;
span1.CopyTo(resultSpan.Slice(from));
from += span1.Length;
span2.CopyTo(resultSpan.Slice(from));
from += span2.Length;
span3.CopyTo(resultSpan.Slice(from));
return result;
}
public static T[] Concat<T>(ReadOnlySpan<T> span0, ReadOnlySpan<T> span1, ReadOnlySpan<T> span2, ReadOnlySpan<T> span3, ReadOnlySpan<T> span4) {
var result = new T[span0.Length + span1.Length + span2.Length + span3.Length + span4.Length];
var resultSpan = result.AsSpan();
span0.CopyTo(result);
var from = span0.Length;
span1.CopyTo(resultSpan.Slice(from));
from += span1.Length;
span2.CopyTo(resultSpan.Slice(from));
from += span2.Length;
span3.CopyTo(resultSpan.Slice(from));
from += span3.Length;
span4.CopyTo(resultSpan.Slice(from));
return result;
}
}
免责声明 在此处的答案不令人满意后,我现在才为我的项目写了这篇文章。如有错误,稍后会编辑。