Linq然后无限期地跑

时间:2014-03-03 18:22:43

标签: c# linq

我有一个功能,只是打算以易于理解的方式打印频繁项目集的字典。目标是首先按字典键的大小排序,然后按数字列表的词典顺序排序。问题出现在ThenBy语句中,因为注释掉的“hello”将无限期地打印出来。如果我将ThenBy更改为不使用比较器并简单地使用另一个int或字符串值,它可以正常工作,所以我显然做错了。

public static void printItemSets(Dictionary<List<int>, int> freqItemSet)
{
    List<KeyValuePair<List<int>, int>> printList = freqItemSet.ToList();
    printList = printList.OrderBy(x => x.Key.Count)
                         .ThenBy(x => x.Key, new ListComparer())
                         .ToList();
}

ListComparer的代码如下:

public class ListComparer: IEqualityComparer<List<int>>, IComparer<List<int>>
{
    public int Compare(List<int> a, List<int> b)
    {
        int larger = a.Count > b.Count ? 1: -1;
        for (int i = 0; i < a.Count && i < b.Count; i++)
        {
            if (a[i] < b[i])
            {
                return -1;
            }
            else if (a[i] > b[i])
            {
                return 1;
            }
            else { }
        }
        return larger;
    }
}

非常简单的测试用例:

int[] a = {1, 3, 5};
int[] b = { 2, 3, 5 };
int[] c = { 1, 2, 3, 5 };
int[] d = { 2, 5 };
int[] e = { 1, 3, 4 };
List<int> aL = a.ToList<int>();
List<int> bL = b.ToList<int>();
List<int> cL = c.ToList<int>();
List<int> dL = d.ToList<int>();
List<int> eL = e.ToList<int>();
Dictionary<List<int>, int> test = new Dictionary<List<int>, int>(new ListComparer());
test.Add(aL, 1);
test.Add(bL, 1);
test.Add(cL, 1);
test.Add(dL, 1);
test.Add(eL, 1);

2 个答案:

答案 0 :(得分:2)

问题是ListComparer没有检查数组是否相同。同时为xy传递了两次相同的数组。检查xy是否相同会解决您的问题。

答案 1 :(得分:1)

您的比较器不处理相同的项目。如果项目相等,则两个项目的顺序决定哪个项目被认为是“更大”。因此,比较器不是“反身的”。反身是属性排序算法所依赖的。

第一行应该是var larger = a.Count.CompareTo(b.Count);,因此真正相同的列表将返回0而不是-11