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
上面的两个答案都解释了它。如果你们中有人粘贴到答案中,我会将其设置为已接受。非常感谢。