我正在尝试编写本质上是 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);