c# - 按文化排序未按预期工作

标签 c# linq sorting culture

为什么“Ū”先出现而不是“U”?

    CultureInfo ci = CultureInfo.GetCultureInfo("lt-LT");
    bool ignoreCase = true; //whether comparison should be case-sensitive
    StringComparer comp = StringComparer.Create(ci, ignoreCase);
    string[] unordered = { "Za", "Žb", "Ūa", "Ub" };
    var ordered = unordered.OrderBy(s => s, comp);

订购的结果: Ūa Ub 杂 B

应该是:Ub Ūa Za Žb

这是按顺序排列的立陶宛字母。 https://www.assorti.lt/userfiles/uploader/no/norvegiska-lietuviska-delione-abecele-maxi-3-7-m-vaikams-larsen.jpg

最佳答案

我刚刚为您的问题做了一个(有限的)解决方案。 这不是优化的,但它可以给出如何解决它的想法。 我创建了一个 LithuanianString 类,它仅用于封装您的字符串。 此类实现 IComparable 以便能够对 LithuanianString 列表进行排序。

这可能是类:

public class LithuanianString : IComparable<LithuanianString>
{

    const string UpperAlphabet = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ";
    const string LowerAlphabet = "aąbcčdeęėfghiįyjklmnoprsštuųūvzž";
    public string String;

    public LithuanianString(string inputString)
    {
        this.String = inputString;
    }

    public int CompareTo(LithuanianString other)
    {
        var maxIndex = this.String.Length <= other.String.Length ? this.String.Length : other.String.Length;
        for (var i = 0; i < maxIndex; i++)
        {
            //We make the method non case sensitive
            var indexOfThis = LowerAlphabet.Contains(this.String[i])
                ? LowerAlphabet.IndexOf(this.String[i])
                : UpperAlphabet.IndexOf(this.String[i]);

            var indexOfOther = LowerAlphabet.Contains(other.String[i])
                ? LowerAlphabet.IndexOf(other.String[i])
                : UpperAlphabet.IndexOf(other.String[i]);

            if (indexOfOther != indexOfThis)
                return indexOfThis - indexOfOther;
        }
        return this.String.Length - other.String.Length;
    }
}

这是我制作的示例:

static void Main(string[] args)
    {
        string[] unordered = { "Za", "Žb", "Ūa", "Ub" };

        //Create a list of lithuanian string from your array
        var lithuanianStringList = (from unorderedString in unordered
            select new LithuanianString(unorderedString)).ToList();
        //Sort it 
        lithuanianStringList.Sort();

        //Display it
        Console.WriteLine(Environment.NewLine + "My Comparison");
        lithuanianStringList.ForEach(c => Console.WriteLine(c.String));
    }

输出是预期的:

Ub Ūa Za Žb

此类允许仅通过替换开头定义的两个常量中的字符来创建自定义字母表。

关于c# - 按文化排序未按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39655522/

相关文章:

c# - 对未触发的 BackgroundWorker 事件感到困惑

c# - 设计器中的 Winforms 标签很好,运行时被切断

c# - Lambda表达式问题

sorting - 在 Haskell 中,如何使用内置的 sortBy 函数对对(元组)列表进行排序?

c# - 为什么在 Sort 中使用 Random 会导致 [Unable to sort IComparer.Compare error]

c# - 我可以限制 ThreadPool 中线程的创建吗?

c# - 如何将 List<KeyValuePair<int,int>> 转换为 int[][]?

c# - 使用 C# 泛型根据列的值检索最常见的元素

ios - 如何根据波斯字符在 swift 中对 JSON 进行排序

python - 在 Python 中返回和打印给出不同的输出