如何使字符串的记录相等不区分大小写?

Dav*_*WEB 6 c# string equality c#-9.0 c#-record-type

我真的很喜欢 C# 9 记录。但是,我找不到一种优雅而简洁的方法来完成这样的事情:

record MyKey(string Foo, int Bar);

[Fact]
public void ShouldEqualIgnoreCase()
{
    MyKey a = new("ID", 42);
    MyKey b = new("Id", 42);

    Assert.Equal(a, b);
}
Run Code Online (Sandbox Code Playgroud)

T1S*_*ace 2

只需使用 ValueObjects 而不是基元。正如乔纳斯已经说过的那样。

创建一个名为“CaseInsensitiveString”的新类来实现 IEquatable。然后记录将使用 Equals 方法。

像这样的东西:

    public readonly struct CaseInsensitiveString : IEquatable<CaseInsensitiveString>
    {
        public readonly String StringValue;

        public CaseInsensitiveString( string value )
        {
            StringValue = value;
        }

        public bool Equals( CaseInsensitiveString other)
        {
            return string.Equals( StringValue, other.StringValue, StringComparison.InvariantCultureIgnoreCase );
        }

        public static implicit operator string( CaseInsensitiveString h ) => h.StringValue;
        public static implicit operator CaseInsensitiveString( string s ) => new CaseInsensitiveString(s);
    }
Run Code Online (Sandbox Code Playgroud)

由于隐式运算符,您可以只使用字符串:

record MyKey(CaseInsensitiveString Foo, int Bar);
...
var a = new MyKey("ID", 42 );
Run Code Online (Sandbox Code Playgroud)

另请参阅:https://wiki.c2.com/?PrimitiveObsession`