如何使用自定义字符对单词进行排序(没有排序方法/功能)?

时间:2014-01-16 20:37:59

标签: c# string-comparison

我在学校有一个任务,我必须用这些姓氏命名一个数组:"Čop", "Dugonik" and "Caf"用斯洛文尼亚字母表。没有"Čop",它可以使用简单的"bubble sort",但使用"Čop"我无法使其正常工作。我通过ASCII表比较字符。斯洛文尼亚字母表:A,B,C,Č,D,......任何想法?当我按ENG字母排序时,它可以工作。我将2个姓氏与此函数进行比较(+ 1个简单的冒泡排序函数用于排序):

    static bool Uredi(Stranka stranka1, Stranka stranka2)
    {
        bool prviJeManjši = false;
        int dolžinaKrajšegaPriimka;

        // zagotovi da nebo prvi priimek daljši od drugega
        if (stranka1.priimek.Length > stranka2.priimek.Length)
        {
            dolžinaKrajšegaPriimka = stranka2.priimek.Length;
        }
        else
        {
            dolžinaKrajšegaPriimka = stranka1.priimek.Length;
        }

        for (int i = 0; i < dolžinaKrajšeBesede; i++)
        {
            if ((char)stranka1.priimek[i] < (char)stranka2.priimek[i])
            {
                prviJeManjši = true;
                break;
            }
        }
        return prviJeManjši;
    }

1 个答案:

答案 0 :(得分:-1)

您需要实现IComparer Interface或Comparison Delegate。 以下是使用lambda表达式

的方法
        List<String> list = new List<string>() { "Čop", "Dugonik", "Caf" };
        string alphabet = "ABCČDEFGHIJKLMNOPQRSTUVWXYZ";
        list.Sort((s1,s2) =>
        {
            s1 = s1.ToUpper();
            s2 = s2.ToUpper();
            if (s1 != s2)
            {
                for (int i = 0; i < s1.Length; i++)
                {
                    if (s1[i] != s2[i])
                    {
                        int index1 = alphabet.IndexOf(s1[i]);
                        int index2 = alphabet.IndexOf(s2[i]);
                        if (index1 != index2)
                            return index1 - index2;
                    }
                }
            }
            return 0;
        });
        list.ForEach(i =>  Console.WriteLine(i));
        Console.ReadKey();

当然你需要修改字母..
顺便说一句,我也想要一个等级:)

您还可以将当前文化更改为Slovanian

System.Globalization.CultureInfo ci = new System.Globalization.CultureInfo("sl-SI");
System.Threading.Thread.CurrentThread.CurrentCulture = ci;
System.Threading.Thread.CurrentThread.CurrentUICulture = ci;