C# C中的字符串顺序错误#

C# C中的字符串顺序错误#,c#,string,linq,currentculture,stringcomparer,C#,String,Linq,Currentculture,Stringcomparer,我运行了以下命令: void Main() { List<string> strings = new List<string>{"aaa", "z", "a"}; Console.WriteLine(string.Join("\n", strings.OrderBy(k => k))); } 这不可能是对的!我期待着 a aaa z 有什么问题吗?我意识到,OrderBy使用当前区域设置对字符串进行排序。在我的例子中,语言环境是丹麦语,其中“aa

我运行了以下命令:

void Main()
{
    List<string> strings = new List<string>{"aaa", "z", "a"};
    Console.WriteLine(string.Join("\n", strings.OrderBy(k => k)));
}
这不可能是对的!我期待着

a
aaa
z

有什么问题吗?

我意识到,
OrderBy
使用当前区域设置对字符串进行排序。在我的例子中,语言环境是丹麦语,其中“aa”在“z”之后,因为它代表字母“å”,它被附加在字母表的末尾

这对我来说是一个惊喜,因为我期待的是英语分类,而我没有意识到该地区一直都是丹麦人;我的系统上的许多其他设置都设置为英语,包括语言。这使我的期望变成了错误

要获得我所期望的排序,将
StringComparer.InvariantCulture
传递给
OrderBy
就足够了:

void Main()
{
    List<string> strings = new List<string>{"aaa", "z", "a"};
    Console.WriteLine(string.Join("\n", strings.OrderBy(k => k, StringComparer.InvariantCulture)));
}

这是因为默认比较器首先按长度排序。您没有尝试使用混合案例对集合进行排序,例如:

List<string> strings = new List<string>{"aaa", "D", "z", "a"};
如果您需要按照编码表中的代码对它们进行排序,那么您很可能更喜欢这种方式:

var keywords = new List<string> { "aaa", "D", "z", "a" };
Console.WriteLine(string.Join("\n", keywords.OrderBy(k => k, StringComparer.Ordinal)));

嗯,我刚刚注意到,你是这样回答自己的问题的吗?比如称呼“你”和“你的”?:)你是在同一分钟内提出问题并回答吗?当然好奇(也是+10)。无论如何这篇评论的重点是强调,这整个问题不是LINQ(或.NET或C#)问题/误解,而是给定程序员对应用程序使用的文化的误解。如果在丹麦语中“aaz-aaa”是正确的,为什么要假设它应该是“aaa-z”?如果你想要以英语为基础的排序,请依赖适当的文化(即,这是我第一次看到这样的排序,几乎依赖任何文化)。@SerhiyChupryk允许在你写问题时写下你自己的回答。这是我第一次这样做,我不知道为什么我会用“你”,我猜是因为无论是谁提出的问题,答案都是有效的。@varocarbas我最初的问题有一个免责声明,在审查后被删除。它说,我认为这对看到“奇怪”排序后感到困惑的人来说是有用的信息。我正在使用丹麦语言环境的计算机工作,但是许多其他设置(包括语言)都设置为美国英语,我期待着英语排序。我不是丹麦人,我不习惯丹麦人的分类,我觉得这很奇怪。其他人可能会遇到类似的问题,并发现问题/答案很有用。为什么指责我不诚实和人为的投票比给我提供如何改进问题和答案的有用建议更容易?我不知道,但我已经做了一些改变,解决了讨论中出现的一些问题。我想问和回答你自己的问题(在我看来不太相关:这只是某种文化特性,在按字母顺序排列时应该考虑到)是可以的。但是,当你知道答案(你在同一分钟内写的)时,在问题中写“有什么想法?”听起来不太正确。我编辑了这个问题。这是不对的,在我的计算机上使用你修改过的字符串列表会产生“a,D,z,aaa”。
List<string> strings = new List<string>{"aaa", "D", "z", "a"};
a
aaa
D
z
var keywords = new List<string> { "aaa", "D", "z", "a" };
Console.WriteLine(string.Join("\n", keywords.OrderBy(k => k, StringComparer.Ordinal)));
D
a
aaa
z