使用C#9.0特性记录时,我遇到了这样一个问题:记录列表(或集合)的IndexOf方法有时似乎不起作用.

在下面的示例中会发生这种情况.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);

所以我的问题是,为什么会发生这种情况,我如何才能绕过这个问题?

推荐答案

从这个question中,我了解到IndexOf方法使用Equals方法来查找其匹配项.

在这article条中,我了解到记录依赖于价值相等:

对于记录,值相等意味着如果记录类型的两个变量匹配并且所有属性和字段值都匹配,则这两个变量相等.

因此,我在我的示例中得到了一个意外的索引,因为我希望记录依赖于引用相等,就像类一样.但如果变量a与b具有相同的类型和值,则IndexOf(b)返回a的索引,而不是b.

Possible solutions

  1. 编写记录的自定义相等性判断,如所讨论的here.
  2. 问问你自己,一份课程 list 是不是更合适.
  3. 重构您的逻辑,使其基于与ReferenceEquals的比较

Csharp相关问答推荐

如何使用Automapper映射两个嵌套列表

注册通用工厂的C# Dep注入

ASP.NET MVC中创建视图的过滤器

实体框架核心中的ComplexType和OwnsOne有什么不同?

Azure函数中实体框架核心的依赖注入

Cosmos SDK和Newtonsoft对静态只读记录的可能Mutations

CS1660无法将lambda表达式转换为类型INavigationBase,因为它不是委托类型

C#使用TextFieldParser读取.csv,但无法使用";0";替换创建的列表空条目

显示文档的ECDsa签名PDF在Adobe Reader中签名后已被更改或损坏

使用Dapper映射联接查询对象数据到使用SplitOn;

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

泛型参数在.NET 8 AOT中没有匹配的批注

C#动态设置ServerReport报表参数

错误CS1061';AuthenticationBuilder';不包含AddOpenIdConnect的定义

Blazor:搜索框在第一次搜索时不搜索

用于请求用户返回列表的C#Google API

如何使用实体框架核心对字符串_agg使用强制转换为varchar(Max)

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

在C#中通过Matheval使用自定义公式

反编译源代码时出现奇怪的字符