我程序的功能是计算文档中唯一单词的出现次数,然后按排序顺序显示它们。我首先遍历所有单词,然后将它们输入字典,然后将字典中的值递增遇到的次数。然后,我将字典转换为列表,并以.Sort
作为参数调用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的值排序。我在这里做错了什么?
最佳答案
在比较器实现中,缺少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
。它使用lambda表达式,因此更易于使用,但是它将创建一个新集合,而不是对提供的集合进行排序。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 });