为何String.IndexOf(string)与ReadOnlySpan.IndexOf(string)返回值不同?
问题:string与ReadOnlySpan的IndexOf/Contains返回值逻辑差异原因?
为什么在以下代码中,string.IndexOf()返回正整数表示匹配成功,而ReadOnlySpan<string>的IndexOf()返回-1表示匹配失败?Contains()方法也存在同样的情况。
string str = "Something Something Something myvalue"; ReadOnlySpan<string> span = new(str); var indexWithString = str.IndexOf(@"myvalue"); var indexWithSpan = span.IndexOf(@"myvalue");
核心原因:两种类型的API作用对象完全不同
1. 类型本质与API定位差异
string.IndexOf(string):作用于单个字符串的字符序列,功能是查找目标子字符串在当前字符串中的起始位置索引(从0开始计数),找到则返回对应正整数索引,找不到返回-1。你的代码里这个调用能正确找到"myvalue"的位置,所以返回正整数。ReadOnlySpan<string>.IndexOf(string):作用于多个字符串组成的序列,功能是查找序列中与目标字符串完全相等的元素,找到则返回该元素在序列中的索引,找不到返回-1。你代码里用new ReadOnlySpan<string>(str)实际上是把整个str包装成了一个仅包含单个元素的Span<string>,这个元素是完整的长字符串,自然找不到等于"myvalue"的元素,所以返回-1。
2. 正确的字符串Span用法
如果要对单个字符串做Span形式的子串查找,应该使用ReadOnlySpan<char>而非ReadOnlySpan<string>,修改代码如下:
string str = "Something Something Something myvalue"; ReadOnlySpan<char> span = str.AsSpan(); // 或直接强制转换为ReadOnlySpan<char> var indexWithSpan = span.IndexOf("myvalue".AsSpan());
此时span.IndexOf的行为就和string.IndexOf完全一致:在字符序列中查找子串的起始位置,找到返回对应索引,找不到返回-1。
3. Contains方法的同理逻辑
string.Contains(string):检查单个字符串中是否包含指定子字符串,存在返回true,否则false。ReadOnlySpan<string>.Contains(string):检查Span中的元素是否有与目标字符串完全相等的项,存在返回true,否则false。而ReadOnlySpan<char>.Contains(ReadOnlySpan<char>)才是检查单个字符串的字符序列中是否包含子序列,和string.Contains逻辑一致。
内容的提问来源于stack exchange,提问作者Alessandro Rizzi
相关产品推荐
相关产品推荐

