C# HashSet Contains和set操作(如Except)之间的不敏感情况有什么不同?

C# HashSet Contains和set操作(如Except)之间的不敏感情况有什么不同?,c#,C#,有人能解释以下行为吗: var h1 = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "apple" }; Console.WriteLine(h1.Contains("APPLE")); // Expected - returns True. var h2 = new HashSet<string>(StringComparer.OrdinalIgnoreCas

有人能解释以下行为吗:

var h1 = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "apple" };
Console.WriteLine(h1.Contains("APPLE")); // Expected - returns True.

var h2 = new HashSet<string>(StringComparer.OrdinalIgnoreCase) { "APPLE" };
Console.WriteLine(h1.Except(h2).Count() == 0); // Surprisingly returns False!
var h1=newhashset(StringComparer.OrdinalIgnoreCase){“apple”};
Console.WriteLine(h1.Contains(“APPLE”);//Expected-返回True。
var h2=新的HashSet(StringComparer.OrdinalIgnoreCase){“APPLE”};
Console.WriteLine(h1.Except(h2.Count()==0);//令人惊讶的是返回错误!
我可以将不区分大小写的比较器传递给Except(),以允许不区分大小写的set操作,但我想知道为什么需要这样做因为我的h1哈希集是用不区分大小写的比较器构造的。

在您的代码中,方法属于
HashSet
类,但该方法是
IEnumerable
的扩展方法,是
系统.Linq的一部分。要获得预期的行为,必须使用接受比较器的。然后,以下代码打印一个预期的
true

var h2=newhashset(StringComparer.OrdinalIgnoreCase){“APPLE”};
Console.WriteLine(h1.Exception(h2,StringComparer.OrdinalIgnoreCase.Count()=0);

Contains
是HashSet中的一个方法,因此它使用它的比较器。另一方面,
Except
是一个可枚举的方法,因此它使用
T
类型的默认比较器。因为
Except
方法来自
System.Linq
(与
包含
来自
HashSet
)不同,应该将比较器传递给它的
h1.Except(h2,StringComparer.OrdinalIgnoreCase).Count()==0
返回
true
上面的两个答案都解释了它。如果你们中有人粘贴到答案中,我会将其设置为已接受。非常感谢。