我正在尝试编写基本上是StringComparison.InvariantCulture
的内容,但其中已填入StringOptions.StringSort
。
(我需要IEnumerable<string>.OrderBy()
,所以我无法将其作为参数传递给String.Compare
。)
但是,StringComparsion.Create
不会将StringOptions
作为参数。
有没有一种单行方式来做到这一点,而不是像here那样编写一个完整的类?
答案 0 :(得分:2)
这不是一个单行解决方案,但它相当简单......
您可以创建自定义比较器:
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());
答案 1 :(得分:0)
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);