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

时间:2011-08-08 19:33:21

标签: c# .net sorting

我有一个像这样的字符串数组:

string[] names = new string[] { "john", "paul", "ringo", "george", "janis" };

我想使用自定义条件对此数组进行排序。它不能按字母顺序排列。它可能按此顺序排列:pgrj

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

问题是:如何按以下顺序对名称数组进行排序:pgrj?在'j'的情况下。贾尼斯可能在约翰之前。

感谢。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我会按照它们应该排序的顺序制作一个字母表的数组。我们称这个数组为sort。然后你可以做类似

的事情
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;

现在有一些免责声明。

  1. 我可能让我的-1和1混淆了。我有一段时间没有看过ICompare,我忘记了哪一个。
  2. 这不会处理两个不同长度的字符串。
  3. 我没有测试过这段代码。
  4. 您可以通过创建自定义类来为每个角色分配权重来改进这一点。

    class CustomAlphabetSort
    {
         public char Character { get; set; }
         public int Weight { get; set; }
    }
    

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