我需要将一些字符串比较从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.我目前的理解是,如果它区分大小写,那么&#34; T&#34;应该先于&#34; t&#34;在排序顺序即-1。如果它不区分大小写,它将是相同的,即0
(仅供参考.Net Framework 4.5.2)
很多thx
答案 0 :(得分:1)
小写在大写之前。 对于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
答案 1 :(得分:0)
排序顺序基于二进制比较或文本比较,具体取决于Option Compare的设置。 - the manual
可以看出有两种比较字符串的方法......那么这是默认的吗?
Option Compare语句指定字符串比较方法(二进制或文本)。默认文本比较方法是二进制。 - https://docs.microsoft.com/en-us/dotnet/visual-basic/programming-guide/language-features/operators-and-expressions/comparison-operators
可以看出二进制是默认比较。这意味着任何大写字母都会被视为小于任何小写字母。即"T"<"t"
为真,但也不直观"Z"<"t"
和"A"<"t"
也属实。
因此,VB实际上可能没有达到您的预期,并且正在使用相当于将StringComparer.Ordinal
传递给String.Compare
方法的比较。请注意,当人们比较他们期望&#34;正常&#34;的字符串时,我说的不是你所期望的。文本比较。
答案 2 :(得分:0)
如果未指定CompareTo(strA,strB)使用
CultureInfo.CurrentCulture.CompareInfo.Compare(strA, strB, CompareOptions.None);
对于en-GB,小写字母小于大写字母。