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)
只需使用 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`