C# 中字符串的相等性和排序比较

字符串比较的基本类型

从功能上来说,在C#中,字符串的比较分为两种:相等性比较和排序比较。相等性比较用于检查两个字符串的内容是否相同,用 == 或者 string.Equals 实现。排序比较用于确定不同的字符串哪个排在前面,哪个在后面。在 C# 中,相等性比较并不是排序比较的子集,两者是相互独立的。

从实现的方法上来说,C# 中字符串比较分为序数比较和文化相关比较。序数很简单,就是把直接逐字符比较字符的 Unicode 值。文化相关比较则把字符串字符视为特定文化字符集中的字符,应用相关规则比较。

从对大小写的处理上来说,分为区分大小写和不区分大小写的比较。当然,这种药针对的是字母语言,在中文用处不大。

对字符串执行比较的方法由 StringComparison 定义。

 public enum StringComparison
 {
     CurrentCulture = 0,
     CurrentCultureIgnoreCase = 1,
     InvariantCulture = 2,
     InvariantCultureIgnoreCase = 3,
     Ordinal = 4,
     OrdinalIgnoreCase = 5
 }
  • CurrentCulture 表示系统当前文化下的大小写敏感比较,系统的当前文化在控制面板中可设置。
  • CurrentCultureIgnoreCase 表示系统当前文化下的不缺分大小写比较
  • InvariantCulture 表示不变文化(美国文化)下的大小写敏感比较
  • InvariantCultureIgnoreCase 表示不变文化下不区分大小写的比较
  • Ordinal 表示大小写敏感的序数比较
  • OrdinalIgnoreCase 表示大小写不敏感的序数比较

相等性比较

相等性比较使用的频次远高于排序比较,因此选择排序方法的首要考量是性能,序数最理想的选择。因此,在 C# 中,字符串类的 == 总是执行区分大小写的序数比较,不添加额外参数的实例方法 string.Equals 方法同样如此。

 // 输出:False
 Console.WriteLine("abc" == "ABC");
 
 // 输出:False
 Console.WriteLine("abc".Equals("ABC"));

要想使用其它比较方法,可以使用 ComparisonType 参数指定。

 Console.WriteLine("abc".Equals("ABC", StringComparison.OrdinalIgnoreCase));

排序比较

与相等性比较不同,C# 中字符串的排序比较默认是基于文化的比较,大小写敏感。

 // 输出: -1,表示 abc 在 ABC 之前
 Console.WriteLine("abc".CompareTo("ABC"));

CompareTo 来自 ICompareIComparable,因此这也是字符串在集合中排序的默认规则。要实现其它类型的比较,必须使用 string 的静态函数实现。

 // 输出: 0,表示 abc 和 ABC 排序相同
 Console.WriteLine(string.Compare("abc", "ABC", StringComparison.OrdinalIgnoreCase));

还有一些其它的方法。

 public static int Compare (string strA, string strB, bool ignoreCase, CultureInfo culture);
 
 public static int Compare (string strA, string strB, bool ignoreCase)
 
 public static int CompareOrdinal (string strA, string strB)

编码建议:尽量使用默认的实现,即相等性比较执行序数比较,排序比较使用基于文化的比较,这通常更有意义。

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章