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
相关产品推荐
相关产品推荐

