3

我正在尝试编写本质上是 a 的内容StringComparison.InvariantCulture,但是已经StringOptions.StringSort烘焙了。(我需要它IEnumerable<string>.OrderBy(),所以我不能像我一样将它作为参数传递给String.Compare。)

但是,StringComparsion.CreateStringOptions作为论据。有没有一种单行的方式来做到这一点,而不是像这里所示的那样编写一个完整的类?

4

2 回答 2

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());
于 2013-07-18T18:30:15.517 回答
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);
于 2020-05-01T20:54:09.200 回答