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

C#中JArray.IndexOf始终返回-1的原因及相关异常疑问

问题原因及解决方法

为什么jaLabels.IndexOf(date)返回-1?

JArray中的元素本质是JToken(具体是JValue类型),并非直接的string类型。你调用IndexOf传入的是string对象,但JArray里存储的是封装了字符串的JValue实例,两者类型不匹配,因此IndexOf找不到匹配项,返回-1。

简单来说:你往JArray里添加字符串时,Add方法会自动把string转成JValue对象存储,但你用原始string去匹配JValue实例,自然无法命中。

为什么First(a => a.ToString().Equals(date))会抛异常?

LINQ的First()方法的特性是:当序列中没有符合条件的元素时,它会直接抛出InvalidOperationException,而非返回null或默认值。这就是你查找"03-Mar"时出错的核心原因——没有匹配元素,First()就触发了异常。

如果想避免异常,应该改用FirstOrDefault(),它在找不到匹配元素时会返回默认值(此处为null),后续可通过判断null来返回-1。

正确的实现方式

方式一:FirstOrDefault配合IndexOf

string date = "01-Jun";
var matchingToken = jaLabels.FirstOrDefault(a => a.ToString().Equals(date));
int index = matchingToken != null ? jaLabels.IndexOf(matchingToken) : -1;
Console.WriteLine(index);

找不到元素时matchingToken为null,直接返回-1,不会抛出异常。

方式二:直接遍历索引

string date = "01-Jun";
int index = -1;
for (int i = 0; i < jaLabels.Count; i++)
{
    if (jaLabels[i].ToString() == date)
    {
        index = i;
        break;
    }
}
Console.WriteLine(index);

方式三:LINQ带索引查询

string date = "01-Jun";
int index = jaLabels.Select((token, idx) => new { Token = token, Index = idx })
                    .FirstOrDefault(x => x.Token.ToString().Equals(date))?
                    .Index ?? -1;
Console.WriteLine(index);

内容的提问来源于stack exchange,提问作者Don2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 06:53:13