首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IComparer未按预期工作

IComparer未按预期工作
EN

Stack Overflow用户
提问于 2015-02-18 21:54:51
回答 2查看 824关注 0票数 1

我的程序的功能是统计文档中出现的唯一单词,然后按排序顺序显示它们。我首先循环遍历所有的单词并将它们输入字典,然后在字典中增加遇到它们的次数。然后,我将字典转换为一个列表,并使用一个.Sort作为参数调用IComparer方法。如下代码所示:

代码语言:javascript
复制
List<KeyValuePair<string,long>> wordList = wordCount.ToList();
IComparer<KeyValuePair<string,long>> comparison = new comparator();
wordList.Sort(comparison);

和我使用的IComparer类

代码语言:javascript
复制
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的值排序。我在这里做错什么了?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-02-18 21:57:49

当您的比较器实现中的y.Value大于x.Value时,您就忽略了这种情况:

代码语言:javascript
复制
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;
    }
}

代码语言:javascript
复制
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表达式,但是它将创建一个新集合,而不是对提供的集合进行排序。

代码语言:javascript
复制
var sorted = wordList.OrderByDescending(x => x.Value).ToList();

您可以在一个查询中完成所有处理(假设words是包含所有单词的字符串的集合):

代码语言:javascript
复制
var sortedWithCount = words.GroupBy(x => x)
                           .OrderByDescending(g => g.Count)
                           .ToList(g => new { Word = g.Key, Count = g.Count });
票数 7
EN

Stack Overflow用户

发布于 2015-02-18 22:00:48

实际上,您应该返回10-1作为比较方法的结果。但是,在您的示例中,您只需使用来自long类型的long方法:

代码语言:javascript
复制
public class Comparator : IComparer<KeyValuePair<string, long>>
{
    public int Compare(KeyValuePair<string, long> x, KeyValuePair<string, long> y)
    {
        return x.Value.CompareTo(y.Value);
    }
}

作为一种好的做法,将类重命名为Comparator而不是comparator。保持干净的密码!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28594692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档