提问人:DavWEB 提问时间:6/18/2021 最后编辑:DavWEB 更新时间:11/11/2022 访问量:965
如何使字符串的记录相等不区分大小写?
How to make records equality case-insensitive for strings?
问:
我真的很喜欢 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);
}
答:
2赞
T1Space
11/11/2022
#1
只需使用 ValueObjects 而不是基元。正如 JonasH 已经说过的那样。
创建一个名为“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);
}
由于隐式运算符,您可以只使用字符串:
record MyKey(CaseInsensitiveString Foo, int Bar);
...
var a = new MyKey("ID", 42 );
参见:https://wiki.c2.com/?PrimitiveObsession'
评论
1赞
Dai
11/11/2022
C2 文章只是 Java 人员的重新发明(如果不是重新发现......来自 FP 的细化类型...- 无论如何,根据我的经验,我发现细化类型应该最小化它们的开销(因为它们没有/不应该有自己的任何可变状态)。在 C# 11 中,我们现在也可以使用。ValueObject
readonly struct
readonly record struct
评论
.ToUpper()
.ToUpper()