从功能上来说,在C#中,字符串的比较分为两种:相等性比较和排序比较。相等性比较用于检查两个字符串的内容是否相同,用 == 或者 string.Equals 实现。排序比较用于确定不同的字符串哪个排在前面,哪个在后面。在 C# 中,相等性比较并不是排序比较的子集,两者是相互独立的。
从实现的方法上来说,C# 中字符串比较分为序数比较和文化相关比较。序数很简单,就是把直接逐字符比较字符的 Unicode 值。文化相关比较则把字符串字符视为特定文化字符集中的字符,应用相关规则比较。
从对大小写的处理上来说,分为区分大小写和不区分大小写的比较。当然,这种药针对的是字母语言,在中文用处不大。
对字符串执行比较的方法由 StringComparison 定义。
public enum StringComparison
{
CurrentCulture = 0,
CurrentCultureIgnoreCase = 1,
InvariantCulture = 2,
InvariantCultureIgnoreCase = 3,
Ordinal = 4,
OrdinalIgnoreCase = 5
}相等性比较使用的频次远高于排序比较,因此选择排序方法的首要考量是性能,序数最理想的选择。因此,在 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 来自 ICompare 和 IComparable
// 输出: 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 条评论) “” |