我发现了String.CompareTo和二分搜索导致的错误(在我的代码中),因为我的自定义IComparer(用于包装类型)使用String.Compare(x, y, StringComparison.Ordinal)
。
这是因为用于构建要搜索的数组的items.OrderBy(i => i.Name)
(其中Name是string类型)使用字符串对象本身作为IComparable - 并且具有不同的规则:
比较使用当前文化来获取特定于文化的信息,例如套管规则和单个字符的字母顺序。例如,文化可以指定某些字符组合被视为单个字符,或者以特定方式比较大写和小写字符,或者字符的排序顺序取决于其前面或后面的字符。 / p>
例如,使用OrderBy-using-Default-String-Compare将{A,b,C}排序为[A, b, C]
,但每次Ordinal比较应该[b, A, C]
- 因为它不是,二进制搜索失败。
现在,使用" context"在路上,
什么是最简单的(例如,没有为字符串实现自定义IComparer)的方式来命令具有与String.Compare(.., StringComparison.Ordinal)
相同的字符串属性的对象?
编辑:我[我意识到我]可以,而且可能应该只使用OrderBy(x => x, theSameComparer)
- 但假设这不可能,OrderBy如何使用相同的结果?
答案 0 :(得分:9)
有一个适用于StringComparison.Ordinal
的预建StringComparer
- 即StringComparer.Ordinal
:
items.OrderBy(i => i.Name, StringComparer.Ordinal)
答案 1 :(得分: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
我相信这就是你的追求。
答案 2 :(得分:0)
值得一提的是,它不仅可以用于Array
,还可以用于List
和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