【发布时间】:2017-06-09 08:39:17
【问题描述】:
如果我尝试按以下方式对字符串列表进行排序:
List<String> lstStrings = new List<string>();
String s1 = "KÜHLSCHRANK";
String s2 = "KUHLSCHRANK";
int i = s1.CompareTo(s2); // returns 1
int j = s2.CompareTo(s1); // return -1
i = StringComparer.InvariantCulture.Compare(s1, s2); // returns 1
j = StringComparer.InvariantCulture.Compare(s2, s1); // returns -1
lstStrings.Add("KÜHLSCHRANK1");
lstStrings.Add("KUTTER");
lstStrings.Add("KUHLSCHRANK2");
lstStrings.Add("KÜHLSCHRANK3");
var lstStrings1 = lstStrings.OrderBy(y => y).ToList();
var lstStrings2 = lstStrings.OrderBy(y => y, StringComparer.InvariantCulture).ToList();
var lstStrings3 = lstStrings.OrderBy(y => y, StringComparer.CurrentCulture).ToList();
var lstStrings4 = lstStrings.OrderBy(y => y, StringComparer.Ordinal).ToList();
我在 lstStrings1、lstStrings2 和 lstStrings3 中得到以下结果:
[0] "KÜHLSCHRANK1"
[1] "KUHLSCHRANK2"
[2] "KÜHLSCHRANK3"
[3] "KUTTER"
只有我的 lstStrings4 显示了我预期的结果:
[0] "KUHLSCHRANK2"
[1] "KUTTER"
[2] "KÜHLSCHRANK1"
[3] "KÜHLSCHRANK3"
谁能解释一下为什么德语的“Ü”默认情况下像普通的“U”一样穿线?
为什么使用 StringComparer.InvariantCulture 的 OrderBy 不关心 StringComparer.InvariantCulture.Compare(s1, s2) 的结果(这意味着 List 像我之前示例中的 lstStrings4 一样有序)?
有没有办法改变这种“默认行为”?
添加: 如果我将数字附加到字符串,比较方法的结果会发生变化:
String s1 = "KÜHLSCHRANK1";
String s2 = "KUHLSCHRANK2";
int i = s1.CompareTo(s2); // returns -1
int j = s2.CompareTo(s1); // return 1
i = StringComparer.InvariantCulture.Compare(s1, s2); // returns -1
j = StringComparer.InvariantCulture.Compare(s2, s1); // returns 1
所以我什至不明白,为什么我的第一个没有数字的测试在每次比较时都不会返回零...
第二次添加: 在 SQL Server 上:
DECLARE @tableDE TABLE (strName NVARCHAR(MAX) COLLATE German_PhoneBook_CI_AI)
INSERT INTO @tableDE (strName)
SELECT e FROM (VALUES('KUHLSCHRANK1'), ('KÜHLSCHRANK2')) f(e)
SELECT * FROM @tableDE ORDER BY strName
给出结果:
KÜHLSCHRANK2
KUHLSCHRANK1
结果:
如果我在 LinqToSql 中执行 OrderBy 并将结果放入列表中,
在 List 变量上添加一个新的OrderBy,即使使用相同的参数,也会改变元素的顺序。
【问题讨论】:
-
您的初始比较并不是非常有用,因为这些字符串永远不会出现在排序列表中。我建议您尝试比较“KÜHLSCHRANK1”和“KUHLSCHRANK2”。
-
@JonSkeet:添加了请求的示例
-
对,所以所有的排序部分现在完全不相关,应该删除。
-
(我怀疑答案是“元音变音只在抢七中相关”或类似的)
-
此处总结的总体字符串比较(添加了德国文化的比较):dotnetfiddle.net/Vg9xL2。检查结果是否正确。
标签: c# list linq cultureinfo