我的程序的功能是统计文档中出现的唯一单词,然后按排序顺序显示它们。我首先循环遍历所有的单词并将它们输入字典,然后在字典中增加遇到它们的次数。然后,我将字典转换为一个列表,并使用一个.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的值排序。我在这里做错什么了?

发布于 2015-02-18 21:57:49
当您的比较器实现中的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 });发布于 2015-02-18 22:00:48
实际上,您应该返回1、0和-1作为比较方法的结果。但是,在您的示例中,您只需使用来自long类型的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);
}
}作为一种好的做法,将类重命名为Comparator而不是comparator。保持干净的密码!
https://stackoverflow.com/questions/28594692
复制相似问题