随着我对ReadOnlySpan<T>和朋友越来越熟悉,我真的开始想知道为什么没有超载的Slice()接受Range.具体地说,当使用ReadOnlySpan<T>.Split(...)时,最终得到一组Range个实例,从那里将Range个实例转换为更有用的东西(在我看来)是笨拙的.例如:

// make a span
var myInput = "ab,cd,ef".AsSpan();

// set up a span to hold the ranges from the Split() call
Span<Range> splitRanges = stackalloc Range[3];

// split the span based on commas
myInput.Split(splitRanges, ',');

// get the offset and length of the first range
var (offset, length) = splitRanges[0].GetOffsetAndLength(myInput.Length);

// slice the original span based on the first range's values
var firstSpan = myInput.Slice(offset, length);

我错过什么了吗?有没有一种更简洁,甚至更习惯的方法来实现这一点?

推荐答案

因为您已经可以使用Range访问ReadOnlySpan<T>,就像使用Span<T>、字符串或数组一样:

var firstSpan = myInput[splitRanges[0]];

它没有这样的文档,因为它使用了"implicit range support"功能,简而言之,这将把它变成对Slice的呼叫.因此,增加需要RangeSlice超载将是多余的.

Csharp相关问答推荐

解析需要HttpClient和字符串的服务

找不到网址:https://localhost:7002/Category/Add?区域= Admin.为什么我的URL是这样生成的?area = Admin而不是/Admin/

. NET 8控制台应用程序DI错误无法解析Microsoft. Extension. Logging. ILoggerFactory类型的服务'''

在调整大小的控件上绘制

方法从数据表中只 Select 一个条件?

C#带主体的主构造函数?

使用Dapper映射联接查询对象数据到使用SplitOn;

C#Null判断处理失败

具有以接口为其类型的属性的接口;类指定接口的实现,但无效

当试图限制EF Select 的列时,如何避免重复代码?

带有列表参数的表达式树

避免只读记录 struct 中的防御副本

在使用UserManager时,如何包含与其他实体的关系?

.NET8->;并发词典总是比普通词典快...怎么回事?[包含基准结果和代码]

如何将默认区域性更改为fr-FR而不是en-US?

当`JToken?`为空时?

NETSDK1201:对于面向.NET 8.0和更高版本的项目,默认情况下,指定RUNTIME标识符将不再生成自包含的应用程序

使用本地公共PEM文件加密字符串,使用Azure KayVault中的私钥解密

.NET文档对继承的困惑

如何根据分割文本的块数来计算文本的大小?