2015-02-18 3 views
1

Функция моей программы - подсчет вхождения уникальных слов в документ, а затем отображение их в отсортированном порядке. Я сначала перебираю все слова и вводим их в словарь, и увеличиваю значение в словаре за сколько раз они встречались. Затем я конвертирую словарь в список и вызываю метод .Sort с параметром IComparer. В этом коде показаны здесь:IComparer не работает должным образом

List<KeyValuePair<string,long>> wordList = wordCount.ToList(); 
IComparer<KeyValuePair<string,long>> comparison = new comparator(); 
wordList.Sort(comparison); 

и класс IComparer Я использую

public class comparator : IComparer<KeyValuePair<string, long>> 
{ 
    public int Compare(KeyValuePair<string, long> x, KeyValuePair<string, long> y) 
    { 
     if (x.Value > y.Value) 
      return 1; 
     else 
      return 0; 
    } 
} 

Однако, когда я закончил с сортировкой, список не упорядочен по значению KeyValuePair вроде как Я надеялся, что так будет. Что я здесь делаю неправильно?

screen shot of poor sorting order

ответ

7

Вы упускаете случая, когда y.Value больше, чем x.Value в вашей реализации компаратором:

public class comparator : IComparer<KeyValuePair<string, long>> 
{ 
    public int Compare(KeyValuePair<string, long> x, KeyValuePair<string, long> y) 
    { 
     if (x.Value > y.Value) 
     { 
      return 1; 
     } 
     else if (x.Value < y.Value) 
     { 
      return -1; 
     } 
     else 
      return 0; 
    } 
} 

или

public class comparator : IComparer<KeyValuePair<string, long>> 
{ 
    public int Compare(KeyValuePair<string, long> x, KeyValuePair<string, long> y) 
    { 
     return x.Value.CompareTo(y.Value); 
    } 
} 

Вы можете также использовать LINQ OrderBy вместо Sort , Это проще в использовании, потому что оно принимает выражение лямбда, но оно создаст новую коллекцию, а не сортирует предоставленную.

var sorted = wordList.OrderByDescending(x => x.Value).ToList(); 

Вы могли бы сделать все ваши обработки в одном запросе (при условии, words представляет собой набор строк со всеми словами):

var sortedWithCount = words.GroupBy(x => x) 
          .OrderByDescending(g => g.Count) 
          .ToList(g => new { Word = g.Key, Count = g.Count }); 
+1

Вам не хватает знака «минус» в вашем примере кода. – phoog

+0

о человеке. Вот и все. Как-то в моем сознании я думал, что мне нужен только один случай. Спасибо за ответ. Я принимаю его в 10 мин. – tezromania

1

На самом деле, вы должны вернуть 1, 0 и -1 в результате для метода сравнения. Но в вашем случае, вы могли бы просто использовать метод CompareTo от long типа, для образца:

public class Comparator : IComparer<KeyValuePair<string, long>> 
{ 
    public int Compare(KeyValuePair<string, long> x, KeyValuePair<string, long> y) 
    { 
     return x.Value.CompareTo(y.Value); 
    } 
} 

Как хороший pratice, переименовать класс Comparator и не comparator. Сохраните чистый код!

Смежные вопросы