使用StringComparison.Ordinal订购String的最简单方法

use*_*740 3 c# string ienumerable compare ordinal

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

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

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

例如,{A,b,C} [A, b, C]与OrderBy-using-Default-String-Compare 一样排序,但应按顺序[b, A, C]进行比较 - 因为它不是,二进制搜索失败.

现在,随着"背景"的出现,

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


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

das*_*ght 9

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

items.OrderBy(i => i.Name, StringComparer.Ordinal)
Run Code Online (Sandbox Code Playgroud)

  • 啊,辉煌(或让我显得沉闷):我假设StringComparer.Ordinal是一个常数 - 应该意识到它本身就是一个比较器. (2认同)