C#中的EqualityComparer是一个泛型类,用于比较两个对象的相等性。它实现了IEqualityComparer接口,该接口定义了两个对象相等的条件。EqualityComparer提供了两种实现方式:
- 通过默认比较器进行比较,使用EqualityComparer.Default静态属性获取默认比较器。当T是引用类型时,它使用Object.Equals方法比较两个对象的相等性。当T是值类型时,它使用EqualityComparer.Default比较相等性。
- 自定义比较器,继承EqualityComparer类,重写Equals和GetHashCode方法,实现自定义比较逻辑。
以下是使用EqualityComparer进行字符串比较的示例:
string str1 = "Hello";
string str2 = "hello";
bool areEqual = EqualityComparer<string>.Default.Equals(str1, str2);
Console.WriteLine(areEqual); // false,因为默认比较器区分大小写
// 自定义比较器
public class CaseInsensitiveComparer : EqualityComparer<string>
{
public override bool Equals(string x, string y)
{
return x.Equals(y, StringComparison.OrdinalIgnoreCase);
}
public override int GetHashCode(string obj)
{
return obj.ToUpper().GetHashCode();
}
}
string str3 = "HELLO";
bool areEqual2 = new CaseInsensitiveComparer().Equals(str1, str3);
Console.WriteLine(areEqual2); // true,因为自定义比较器不区分大小写
上面的例子中,首先使用EqualityComparer.Default比较器进行比较,由于默认比较器区分大小写,因此返回false。然后定义了一个自定义比较器CaseInsensitiveComparer,重写了Equals和GetHashCode方法实现了不区分大小写的比较逻辑,再次进行比较,返回true。
StringComparison.OrdinalIgnoreCase
StringComparison.OrdinalIgnoreCase 是一个枚举类型,用于比较字符串时指定字符串的比较规则。它表示字符串的比较应该忽略大小写,例如 “apple” 和 “APPLE” 将被认为是相等的。
具体来说,OrdinalIgnoreCase 是比较规则的一个选项,其中 Ordinal 表示比较的是字符串的顺序,IgnoreCase 表示比较时忽略大小写。因此,使用 OrdinalIgnoreCase 比较字符串时,它们的字母顺序和大小写将被忽略,只有它们的字符序列相同才会被认为是相等的。