C# 非字母顺序的字符串数组的自定义排序

C# 非字母顺序的字符串数组的自定义排序,c#,.net,sorting,C#,.net,Sorting,我有一个如下的字符串数组: string[] names = new string[] { "john", "paul", "ringo", "george", "janis" }; 我想使用自定义条件对该数组进行排序。不能按字母顺序。可能是这样的顺序:pgrj 我试图实现一个新的IComparer,但是在Compare方法中我不能使用string.Compare,因为它会按字母顺序排序,我不想这样做 问题是:如何按以下顺序对名称数组排序:pgrj?在“j”案中。杰尼斯可能在约翰之前 谢谢。我

我有一个如下的字符串数组:

string[] names = new string[] { "john", "paul", "ringo", "george", "janis" };
我想使用自定义条件对该数组进行排序。不能按字母顺序。可能是这样的顺序:pgrj

我试图实现一个新的IComparer,但是在Compare方法中我不能使用string.Compare,因为它会按字母顺序排序,我不想这样做

问题是:如何按以下顺序对名称数组排序:pgrj?在“j”案中。杰尼斯可能在约翰之前


谢谢。

我会把字母表中的字母按顺序排列起来。让我们称之为数组排序。然后你可以做类似的事情

void Main()
{
    string[] names = new string[] { "john", "paul", "ringo", "george", "janis" };
    var reorderedNames = names.OrderByDescending(x => x, new MyComparer());
}

class MyComparer : IComparer<string>{

    int IComparer<string>.Compare(string s1, string s2){

        char l1 = s1[0];
        char l2 = s2[0];
        int ret;

        switch(l1){

            case 'g':   if(l2 == 'p'){
                            return -1;
                        }
                        else{
                            goto default;
                        }
            case 'r':   if(l2 == 'p' || l2 == 'g'){
                            return -1;
                        }
                        else{
                            goto default; 
                        }
            case 'j':   if(l2 == 'p' || l2 == 'g' || l2 == 'r'){
                            return -1;
                        }
                        else{
                            goto default;
                        }
            default:    ret = (l2 != l1) ?  1 : s1.CompareTo(s2); return ret;   
        }
        return ret;
    }
};
for (int i = 0; i < s1.Length; i++)
{
    int s1Value = sort.IndexOf(s1[i]);
    int s2Value = sort.IndexOf(s2[i]);

   if(s1Value > s2Value)
       return 1;

   if(s2Value > s1Value)
       return -1;
}

return 0;

从这里,您可以对字符串中每个字母的值求和,并以这种方式进行比较。这可能比你的情况需要的复杂一点

我会把字母表中的字母按顺序排列成一个数组。让我们称之为数组排序。然后你可以做类似的事情

for (int i = 0; i < s1.Length; i++)
{
    int s1Value = sort.IndexOf(s1[i]);
    int s2Value = sort.IndexOf(s2[i]);

   if(s1Value > s2Value)
       return 1;

   if(s2Value > s1Value)
       return -1;
}

return 0;

从这里,您可以对字符串中每个字母的值求和,并以这种方式进行比较。这可能比您的情况需要的复杂一点

看这个答案,这个自定义顺序纯粹是基于重新排列字母表吗?换句话说,如果Janis排在John之前,那是因为a会排在o之前,不管它在单词中的位置如何?Eric Lippert在这些博客文章中提供了一些关于自定义排序的好提示:是的,这纯粹是基于重新排列字母表。我错了。我将列出字母表中的所有单词并重新排列。单词数组也可能被重新排列。我已经尝试在IComparer中使用StartWith。但是我只能用每个单词的第一个字母来排序。看到这个答案了吗?这个自定义顺序纯粹是基于字母表的重新排列吗?换句话说,如果Janis排在John之前,那是因为a会排在o之前,不管它在单词中的位置如何?Eric Lippert在这些博客文章中提供了一些关于自定义排序的好提示:是的,这纯粹是基于重新排列字母表。我错了。我将列出字母表中的所有单词并重新排列。单词数组也可能被重新排列。我已经尝试在IComparer中使用StartWith。但是我只能用每个单词的第一个字母来排序。我会试着增加这个想法。很好。我会试着增加这个想法。