我想写一个本质上的 StringComparison.InvariantCulture
但有 StringOptions.StringSort
(我需要它用于 IEnumerable<string>.OrderBy()
所以,我不能像在这里一样把它作为参数传给 String.Compare
.)
然而, StringComparsion.Create
不取 StringOptions
作为论据.有没有一种单行的方法,而不是像图中所示的那样写一整节课。此处?
这不是一个单行的解决方案,但它相当简单......
你可以创建一个自定义比较器。
class InvariantCultureStringSortComparer : IComparer<string>
{
private readonly CompareInfo _compareInfo = CultureInfo.InvariantCulture.CompareInfo;
public int Compare(string x, string y)
{
return _compareInfo.Compare(x, y, CompareOptions.StringSort);
}
}
然后把它作为一个参数传给 OrderBy
:
var ordered = items.OrderBy(i => i.Name, new InvariantCultureStringSortComparer());
对于oneliner来说有点长,但你可以通过使用通用的方式避免创建该类。Comparer<>.Create()
来创建一个使用提供的lambda进行实际比较的比较器。
var comparison = CultureInfo.InvariantCulture.CompareInfo;
var comparer = Comparer<Item>.Create((a, b) => comparison.Compare(a.Name, b.Name, CompareOptions.StringSort));
var ordered = items.OrderBy(i => i, comparer);