我正在尝试编写本质上是 a 的内容StringComparison.InvariantCulture
,但是已经StringOptions.StringSort
烘焙了。(我需要它IEnumerable<string>.OrderBy()
,所以我不能像我一样将它作为参数传递给String.Compare
。)
但是,StringComparsion.Create
不StringOptions
作为论据。有没有一种单行的方式来做到这一点,而不是像这里所示的那样编写一个完整的类?
我正在尝试编写本质上是 a 的内容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);