2011-08-08 2 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

Является ли этот обычай порядок основывается исключительно на переупорядочить алфавит? Другими словами, если «Янис» приходит перед «Джоном», это потому, что «а» будет раньше «о», независимо от того, где он находится в слове? – StriplingWarrior

+0

Есть несколько хороших советов в этих блогах Эрика Липперта при работе с пользовательской сортировкой: 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; 
    } 
}; 
Смежные вопросы