5

我发现了一个由String.CompareTo和二进制搜索产生的错误(在我的代码中),因为我的自定义 IComparer (用于包装类型)使用String.Compare(x, y, StringComparison.Ordinal).

这是因为items.OrderBy(i => i.Name)(其中 Name 是字符串类型)用于构建要搜索的 Array 使用字符串对象本身作为 IComparable - 并且具有不同的规则:

比较使用当前文化来获取特定于文化的信息,例如大小写规则和单个字符的字母顺序。例如,文化可以指定某些字符组合被视为单个字符,或以特定方式比较大小写字符,或者字符的排序顺序取决于其前面或后面的字符。

例如,{A, b, C}[A, b, C]与 OrderBy-using-Default-String-Compare 一样排序,但应该[b, A, C]按照 Ordinal 比较 - 因为它不是,所以二分查找失败。

现在,有了“上下文”,

什么是最简单的(例如,没有为字符串实现自定义 IComparer)方法来对具有与字符串属性相同的对象进行排序String.Compare(.., StringComparison.Ordinal)


编辑:我 [刚刚意识到我] 可以而且可能应该只使用OrderBy(x => x, theSameComparer)- 但假设这是不可能的,如何使用 OrderBy 来获得相同的结果?

4

3 回答 3

11

StringComparer有一个适用的预建StringComparison.Ordinal- 那是StringComparer.Ordinal

items.OrderBy(i => i.Name, StringComparer.Ordinal)
于 2015-02-20T21:48:02.310 回答
2

您应该能够StringComparer.Ordinal直接添加到您的OrderBy.

string[] content = { "A", "b", "C", "d", "AB", "Ab" };
var ordered = content.OrderBy(o => o, StringComparer.Ordinal);

然后,一旦您遍历,ordered您将收到以下输出:

// Output:
A
AB
Ab
C
b
d

我相信那是你的追求。

于 2015-02-20T21:54:49.073 回答
1

值得一提的是,它不仅可以用于ArrayList排序,还可以用于Linq

string[] content = { "A", "b", "C", "d", "AB", "Ab" };
Array.Sort(content);
//output: A,Ab,AB,b,C,d
Array.Sort(content, StringComparer.Ordinal);
//output: A,AB,Ab,C,b,d

var list = new List<string>{ "A", "b", "C", "d", "AB", "Ab" };
list.Sort(StringComparer.Ordinal);
//output: the same as array.srot and linq with Ordinal comparer
于 2021-06-21T14:39:44.440 回答