c#立陶宛字母排序

本文关键字:排序 立陶宛 | 更新日期: 2023-09-27 18:08:11

我需要将文件中的字母排序为字母表。我该怎么做呢?我需要ToString方法。现在控制台打印:

ABCDEFGIJKLM…ĄČĖĮ……

我需要得到这个:

ĄBCČDEĘĖFGHIĮYJKLMNOPRSŠ涂ŲŪVZŽ

感谢
  static char[] Letters(string e) // 
    {
        e = e.ToUpper();
        char[] mas = new char[32];
        int n = 0;
        foreach (char r in e)
            if (Array.IndexOf(mas, r) < 0)
                if (Char.IsLetter(r))
                    mas[n++] = r;
        Array.Resize(ref mas, n);
        Array.Sort(mas);
        return mas;
    }

c#立陶宛字母排序

您可以通过使用理解如何按字母顺序比较字符的比较器对字符进行排序来解决这个问题(默认是顺序比较)。

这个实现是非常低效的,因为它每次进行比较时都将字符转换为字符串,但它是有效的:

public class CharComparer : IComparer<char>
{
    readonly CultureInfo culture;
    public CharComparer(CultureInfo culture)
    {
        this.culture = culture;
    }
    public int Compare(char x, char y)
    {
        return string.Compare(new string(x, 1), 0, new string(y, 1), 0, 1, false, culture);
    }
}

(注意:这里实际上不需要文化;没有它也能工作。我只是为了完整而把它包括在内。)

然后您可以将其用于接受IComparer的排序函数,例如Array.Sort():

static void Main()
{
    var test = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ".ToCharArray();
    Console.OutputEncoding = System.Text.Encoding.Unicode;
    Array.Sort(test);
    Console.WriteLine(new string(test)); // Wrong result using default char comparer.
    Array.Sort(test, new CharComparer(CultureInfo.GetCultureInfo("lt")));  // Right result using string comparer.
    Console.WriteLine(new string(test));
}

另一种方法是使用单字符字符串数组而不是字符数组,并对其进行排序。这是有效的,因为排序函数将使用字符串比较器,它理解字母顺序:

var test = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ".Select(x => new string(x, 1)).ToArray();
Console.OutputEncoding = System.Text.Encoding.Unicode;
Array.Sort(test); // Correct result because it uses the string comparer, which understands alphabetical order.
Console.WriteLine(string.Concat(test)); 

或者使用Linq:

var test = "AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪVZŽ".Select(x => new string(x, 1)).ToArray();
Console.OutputEncoding = System.Text.Encoding.Unicode;
// Correct result because it uses the string comparer, which understands alphabetical order.
test = test.OrderBy(x => x).ToArray();
Console.WriteLine(string.Concat(test)); 

在这样排序时,使用字符串数组而不是字符数组可能会更高效。

您可以使用以下方法删除变音符号:

static string RemoveDiacritics(string text)
{
    var normalizedString = text.Normalize(NormalizationForm.FormD);
    var stringBuilder = new StringBuilder();
    foreach (var c in normalizedString)
    {
        var unicodeCategory = CharUnicodeInfo.GetUnicodeCategory(c);
        if (unicodeCategory != UnicodeCategory.NonSpacingMark)
        {
            stringBuilder.Append(c);
        }
    }
    return stringBuilder.ToString().Normalize(NormalizationForm.FormC);
}

然后你可以使用这些字符来排序:

string e = "ABCDEFGIJKLM...ĄČĖĮ...";
var normalizedCharList = e.Zip(RemoveDiacritics(e), (chr, n) => new { chr, normValue = (int)n }).ToList();
var orderedChars = normalizedCharList.OrderBy(x => x.normValue).Select(x => x.chr);
string ordered = new String(orderedChars.ToArray());