【发布时间】:2015-04-22 16:57:29
【问题描述】:
我发现了一个由String.CompareTo 和二进制搜索导致的错误(在我的代码中),因为我的自定义 IComparer(用于包装类型)使用了String.Compare(x, y, StringComparison.Ordinal)。
这是因为 items.OrderBy(i => i.Name)(其中 Name 是字符串类型)用于构建要搜索的 Array 使用字符串对象本身作为 IComparable - 并且具有不同的规则:
比较使用当前文化来获取特定于文化的信息,例如大小写规则和单个字符的字母顺序。例如,文化可以指定某些字符组合被视为单个字符,或以特定方式比较大小写字符,或者字符的排序顺序取决于其前面或后面的字符。
例如,{A, b, C} 使用 OrderBy-using-Default-String-Compare 排序为 [A, b, C],但根据 Ordinal 比较应该是 [b, A, C] - 因为不是,所以二进制搜索是失败。
现在,把“上下文”排除在外,
使用与String.Compare(.., StringComparison.Ordinal) 相同的字符串属性对对象进行排序的最简单(例如,不为字符串实现自定义 IComparer)方法是什么?
编辑:我 [刚刚意识到我] 可以而且可能应该只使用 OrderBy(x => x, theSameComparer) - 但假设这是不可能的,如何使用 OrderBy 来获得相同的结果?
【问题讨论】:
标签: c# string compare ienumerable ordinal