2011-08-08 73 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; 
    } 
};