我程序的功能是计算文档中唯一单词的出现次数,然后按排序顺序显示它们。我首先遍历所有单词,然后将它们输入字典,然后将字典中的值递增遇到的次数。然后,我将字典转换为列表,并以.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 });

10-06 12:20