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

时间:2015-02-20 21:41:40

标签: c# string compare ienumerable ordinal

我发现了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如何使用相同的结果?

3 个答案:

答案 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,还可以用于ListLinq排序:

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