2011-08-08 46 views
1

我有一个字符串数组是这样的:自定义排序字符串数组非字母

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

我想排序使用自定义标准,此阵。它不能按字母顺序排列。它可能按以下顺序排列:pgrj

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

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

谢谢。

+0

看到这个答案 http://stackoverflow.com/questions/6984457/linq-complex-sorting/6984509#6984509 – yoozer8

+0

纯粹是基于这个自定义为了这可能是一个有点复杂重新排列字母表?换句话说,如果“贾尼斯”来到“约翰”之前,那是因为“a”会在“o”之前出现,而不管它在这个词的哪个位置? – StriplingWarrior

+0

在处理自定义排序时,Eric Lippert在这些博客文章中提供了一些很好的提示:http://bit.ly/piH3eu – DaveShaw

回答

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. 我还没有测试过这段代码。

您可以通过自定义类为每个字符分配一个权重来改善此问题。

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

从这里你可以总结一个字符串的每个字母的值,并做比较的方式。比你的情况需要

+0

不错。我会尝试增加这个想法。 – armandomiani

+0

已编辑。现在它可以工作。批准后,我会标记为已回答。 – armandomiani

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