基于字符串的不变式IComparer<string&gt。

问题描述 投票:3回答:2

我想写一个本质上的 StringComparison.InvariantCulture但有 StringOptions.StringSort (我需要它用于 IEnumerable<string>.OrderBy()所以,我不能像在这里一样把它作为参数传给 String.Compare.)

然而, StringComparsion.Create 不取 StringOptions 作为论据.有没有一种单行的方法,而不是像图中所示的那样写一整节课。此处?

c# string-comparison
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());

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);
© www.soinside.com 2019 - 2024. All rights reserved.