You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 14:15:14