C# 为什么使用这个字符串(“Abdul Baha”&“x27””^^mso:text@de)不';不要以“开始”开头;?

C# 为什么使用这个字符串(“Abdul Baha”&“x27””^^mso:text@de)不';不要以“开始”开头;?,c#,string,char,startswith,C#,String,Char,Startswith,有人能告诉我为什么吗?您需要使用函数的第二个参数BeginsWithStringComparison.Ordinal(或StringComparison.OrdinalIgnoreCase)。这指示函数按字符值进行比较,并且在排序时不考虑文化信息。此报价来自下面的MSDN链接: 使用单词排序规则的操作会执行区域性敏感比较,其中某些非字母Unicode字符可能具有指定的特殊权重。使用单词排序规则和特定区域性的约定,连字符(“-”)可能具有非常小的权重,以便“coop”和“co-op”“在排序列表中

有人能告诉我为什么吗?

您需要使用函数的第二个参数
BeginsWith
StringComparison.Ordinal
(或
StringComparison.OrdinalIgnoreCase
)。这指示函数按字符值进行比较,并且在排序时不考虑文化信息。此报价来自下面的MSDN链接:

使用单词排序规则的操作会执行区域性敏感比较,其中某些非字母Unicode字符可能具有指定的特殊权重。使用单词排序规则和特定区域性的约定,连字符(“-”)可能具有非常小的权重,以便“coop”和“co-op”“在排序列表中彼此相邻显示。”

这似乎会影响BeginsWith的执行方式,具体取决于语言环境/文化(请参阅OP文章中的评论)——它对某些人有效,但对其他人无效

在下面的示例(单元测试)中,我展示了如果将字符串转换为字符数组并查看第一个字符,它实际上是相同的。调用BeginsWith函数时,需要添加顺序比较以获得相同的结果

作为参考,我的语言环境是瑞典语

欲了解更多信息:


两者都是
true
。你的角色
ʿ
不是在第一个位置,而是在第二个位置,那么它之间有什么关系呢?我刚刚试过。两者都是真的。你用什么语言环境来进行比较?我猜是一个单错误…不变量文化返回假和真。“\”阿卜杜勒巴哈“\”^^mso:text@de.StartsWith(“\”,StringComparison.InvariantCulture); // 为假“\”阿卜杜勒巴哈“\”^^mso:text@de“.StartsWith(“\”,StringComparison.InvariantCulture);//为true
"\"ʿAbdul-Baha'\"^^mso:text@de".StartsWith("\"") // is false
"\"Abdul-Baha'\"^^mso:text@de".StartsWith("\"") // is true
(int)'ʿ' // is 703`
[Test]
public void BeginsWith_test()
{
    const string string1 = "\"ʿAbdul-Baha'\"^^mso:text@de";
    const string string2 = "\"Abdul-Baha'\"^^mso:text@de";

    var chars1 = string1.ToCharArray();
    var chars2 = string2.ToCharArray();

    Assert.That(chars1[0], Is.EqualTo('"'));
    Assert.That(chars2[0], Is.EqualTo('"'));

    Assert.That(string1.StartsWith("\"", StringComparison.InvariantCulture), Is.False);
    Assert.That(string1.StartsWith("\"", StringComparison.CurrentCulture), Is.False);
    Assert.That(string1.StartsWith("\"", StringComparison.Ordinal), Is.True); // Works
    Assert.That(string2.StartsWith("\""), Is.True);
}