繁体   English   中英

了解字符串比较行为

[英]Understanding String Comparison behaviour

我需要将一些字符串比较从vb转换为c#。 vb代码使用>和<运算符。 我希望用标准的框架字符串比较方法替换它。 但是,有一种我不理解的行为。 为了复制这个,我有这个测试

[TestMethod]
public void TestMethod2()
{
    string originalCulture = CultureInfo.CurrentCulture.Name; // en-GB

    var a = "d".CompareTo("t");  // returns -1
    var b = "T".CompareTo("t");  // returns 1

    Assert.IsTrue(a < 0, "Case 1");
    Assert.IsTrue(b <= 0, "Case 2");
}

有人可以解释为什么b返回1.我目前的理解是,如果它区分大小写,那么“T”应该在排序顺序中的“t”之前,即-1。 如果它不区分大小写,它将是相同的,即0

(仅供参考.Net Framework 4.5.2)

很多thx

小写在大写之前。 对于en-GB和InvariantCulture都是如此。

如果您想要类似ASCII的行为,则应指定其他CompareOptions.Ordinal参数

请参阅以下内容:

repl.it上的示例代码:

using System;
using System.Globalization;
using System.Collections.Generic;

class MainClass
{
    public static void Main(string[] args)
    {

        //All the following case sensitive comparisons puts d before D
        Console.WriteLine("D".CompareTo("d"));
        Console.WriteLine(String.Compare("D", "d", false));
        Console.WriteLine(String.Compare("D", "d", false, CultureInfo.InvariantCulture));

        //All the following case sensitive comparisons puts capital D before small letter d
        Console.WriteLine(String.Compare("D", "d", CultureInfo.InvariantCulture, CompareOptions.Ordinal));

        //The following is case insensitive
        Console.WriteLine(String.Compare("D", "d", true));

        //The default string ordering in my case is d before D
        var list = new List<string>(new[] { "D", "d" });
        list.Sort();
        foreach (var s in list)
        {
            Console.WriteLine(s);
        }
    }
}

//Results on repl.it
//Mono C# compiler version 4.0.4.0
//   
//1
//1
//1
//-32
//0
//d
//D

祝好运

的Eyal

排序顺序基于二进制比较或文本比较,具体取决于Option Compare的设置。 - https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/operators-and-expressions/comparison-operators

可以看出有两种比较字符串的方法......那么哪个是默认的?

Option Compare语句指定字符串比较方法(二进制或文本)。 默认文本比较方法是二进制。 - https://docs.microsoft.com/en-us/dotnet/visual-basic/language-reference/statements/option-compare-statement

可以看出二进制是默认比较。 这意味着任何大写字母都会被视为小于任何小写字母。 即, "T"<"t"为真,但非直观的"Z"<"t""A"<"t"也都是正确的。

因此,很可能VB实际上没有按照您的预期进行操作,而是使用等效的比较将StringComparer.Ordinal传递给String.Compare方法。 注意我说的不是你期望的那种正常情况,当人们比较他们期望“正常”文本比较的字符串时。

如果未指定CompareTo(strA,strB)使用

CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None);

对于en-GB,小写字母小于大写字母。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM