基于字符串的不变IComparer <string> </string>

时间:2013-07-18 18:06:15

标签: c# string-comparison

我正在尝试编写基本上是StringComparison.InvariantCulture的内容,但其中已填入StringOptions.StringSort。 (我需要IEnumerable<string>.OrderBy(),所以我无法将其作为参数传递给String.Compare。)

但是,StringComparsion.Create不会将StringOptions作为参数。 有没有一种单行方式来做到这一点,而不是像here那样编写一个完整的类?

2 个答案:

答案 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);