C#排序立陶宛字母

时间:2016-09-21 14:04:32

标签: c#

我需要将文件中的字母排序为字母。我怎样才能做到这一点?我需要ToString方法。现在控制台打印:

  

ABCDEFGIJKLM ......ĄČĖĮ......

我需要得到这个:

  

AĄBCČDEĘĖFGHIĮYJKLMNOPRSŠTUŲŪ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;
    }

2 个答案:

答案 0 :(得分:0)

您可以使用following method删除diacritics

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());

答案 1 :(得分:0)

您可以通过使用比较器对字符进行排序来解决此问题,该比较器了解如何按字母顺序比较字符(默认为序数比较)。

这种实现效率非常低,因为它每次进行比较时都会将字符转换为字符串,但它可以正常工作:

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));
}

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

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

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