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

C# 9.0记录类型集合的IndexOf方法为何有时失效?

C# 9.0记录类型List.IndexOf返回错误索引的问题

在使用C# 9.0的record特性时,遇到记录类型集合的IndexOf方法返回不符合预期的索引值:调用things.IndexOf(b)返回0,但预期结果是1,代码示例如下:

void Main()
{
    var a = new Thing("Hello", 100);
    var b = new Thing("Hello", 100);
    
    var things = new List<Thing> { a, b };
    
    Console.WriteLine(things.IndexOf(b));
}

public record Thing (string Name, int Number);

问题原因

  • C#的record类型默认实现了值相等性:编译器会自动生成基于属性值的Equals方法,当比较两个记录实例时,只要所有属性值一致,就会被判定为相等。
  • List<T>.IndexOf方法默认使用EqualityComparer<T>.Default进行相等性判断,对于record类型,这个比较器会采用值相等逻辑。示例中a和b的属性值完全相同,所以IndexOf(b)会找到第一个值相等的元素(即a),返回其索引0。

解决方法

根据实际需求选择以下方案:

1. 基于引用相等性查找(匹配同一个对象实例)

如果需要找到集合中与b是同一个实例的元素,使用List.FindIndex结合object.ReferenceEquals:

Console.WriteLine(things.FindIndex(item => object.ReferenceEquals(item, b)));

2. 基于值相等性查找后续匹配项

如果确实需要值相等性,但要找到第二个匹配的元素,可以从第一个匹配索引的下一位开始查找:

int firstMatchIndex = things.IndexOf(b);
int secondMatchIndex = things.IndexOf(b, firstMatchIndex + 1);
Console.WriteLine(secondMatchIndex); // 输出1

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 16:07:09