我想判断一下是否包含Span<T>个元素的Span<T>个元素的顺序相同.

Span<byte> buffer = stackalloc byte[] { 1, 6, 2, 5, 3, 4 };

Span<byte> needle1 = stackalloc byte[] { 2, 5, 3 }; // this one is contained in buffer in the same order
Span<byte> needle2 = stackalloc byte[] { 2, 5, 4 }; // this one is not contained in buffer in the same order

我知道我可以使用Span<T>.Contains(),它只接受一个元素作为参数来找到缓冲区中针的第一个元素,然后手动逐个比较下一个元素,但这似乎是非常不理想和乏味的过程.

Span<T>.Overlaps()在这里不是答案,因为指针不是存储在与缓冲区相同的内存地址中.出于性能方面的原因,我希望避免使用LINQ.在我遗漏的标准库中有没有其他方法?

推荐答案

您可以使用MemoryExtensions.IndexOf<T>(this Span<T> span, ReadOnlySpan<T> value):

返回指定序列的索引,并返回其第一个匹配项的索引.值使用IEquatable{T}.Equals(T)进行比较.

Returns Int32
The index of the occurrence of the value in the span. If not found, returns -1.

var contains1 = buffer.IndexOf(needle1) >= 0;
var contains2 = buffer.IndexOf(needle2) >= 0;

Csharp相关问答推荐

自定义JsonEditor,用于将SON序列化为抽象类

使用变量子根名称在C#中重新初始化SON文件

如何从泛型方法返回一个可为空的T,其中T:notnull?

一种安全的方式来存储SSH凭证(MAUI/C#应用程序)

使用客户端密钥为Fabric Rest API生成令牌

NumPy s fftn in C#with pythonnet'

有没有办法在WPF文本框中添加复制事件的处理程序?

单行上的ReSharper数据标注

在.NET 7.0 API控制器项目中通过继承和显式调用基类使用依赖项注入

EF核心区分大小写的主键

在DoubleClick上交换DataGridViewImageColumn的图像和工具提示

为值对象编写自定义JsonConverter

在C#ASP.NET内核中使用INT AS-1进行控制器场景的单元测试

在';、';附近有错误的语法.必须声明标量变量";@Checkin";.';

WPF动态设置弹出窗口水平偏移

在.NET8中如何反序列化为私有字段?

工厂类是如何在.NET 8中注册的?

DropDownListFor未显示选定值

我是否以错误的方式使用了异步延迟初始化?

为什么我不能在固定语句中使用外部函数?