System.StringComparer和System.StringComparison类之间的区别?

24 c# asp.net

这两个班级有什么区别?

我使用过System.StringComparer.OrdinalIgnoreCase(),System.StringComparison.OrdinalIgnoreCase()并且都产生了相同的结果.他们有任何区别或两者相同吗?

Met*_*ght 16

StringComparerClass它实现像比较接口IComparer,IEqualityComparer,IComparer<String>,使得它可以用来比较两个字符串.

StringComparison只是一个Enum你可以传递给某些方法来表明你想要哪种比较.在那种情况下,我怀疑底层方法将使用a StringComparer来进行实际比较.

何时使用每个

String.Equals这样的字符串特定方法只接受一个StringComparison值,因此在这种情况下你会使用它.

您将使用StringComparerfor比较器作为参数的方法,并在将比较字符串的上下文中调用.例如,如果您有一个List<String>,并希望以不区分大小写的方式对该列表进行排序,则可以执行以下操作:

myList.Sort(StringComparer.OrdinalIgnoreCase);
Run Code Online (Sandbox Code Playgroud)


Tig*_*ran 7

问题是:为什么要在一个框架中同时拥有它们?

解释是这样的:

  • 字符串比较是:

指定 String.Compare 和 String.Equals 方法的某些重载要使用的区域性、大小写和排序规则

  • StringComparer 是:

表示使用特定大小写和基于区域性或序数比较规则的字符串比较操作

注意到不同了吗?

在第二种情况下,如果StringComparer有 的概念string comparison operation,但没有string类型。

事实上,如果你看这个,你会简单地读到:

一些将字符串比较作为中心操作的非字符串方法使用 StringComparer 类型。

来自同一链接的示例:

Array.BinarySearch(this.storedNames, name, StringComparer.Ordinal)
Run Code Online (Sandbox Code Playgroud)

StringComparerarray引用类型的内容之间使用比较“基础” 。

  • 优秀的答案。更明确地说:您可能永远不应该设计将 StringComparison 作为输入的方法或类——您应该将其作为 StringComparer,因为这将允许您的代码的客户端在需要时传入他们自己的自定义比较器。比较器是可扩展的,而比较器则不是。 (3认同)