SortedSet.Contains给出错误“至少有一个对象必须实现ICombarable”

时间:2013-08-19 18:13:59

标签: c# icomparable sortedset

我有两个SortedSets:

SortedSet<SortedSet<int>> sset1 = new SortedSet<SortedSet<int>>();
SortedSet<SortedSet<int>> sset2 = new SortedSet<SortedSet<int>>();

稍后我查看我制作一个新的Sorted集:

 SortedSet<int> newSset = MethodThatReturnsSortedSet();

现在我想检查sset1和sset2是否包含newSset:

if (!sset1.Contains(newSset) && !sset2.Contains(newSset))  <--error on this line
   {
       sset1.Add(next);
       //some more code
   }

所以我得到的错误是Argument Exception,“这些对象中至少有一个必须实现IComparable。

我已经查看了同样问题的其他问题,但在他们的情况下,他们想要比较他们自己的类。我只是检查某个项目是否在一个集合中。所以是啊..我不知道如何解决这个问题,任何指针?

1 个答案:

答案 0 :(得分:0)

除非您指定自定义比较器,否则不能SortedSet SortedSet,因为SortedSet本身并未实现IComparable

每当您使用SortedSet<X>类型时,该集合都会根据X按递增顺序排列,因此X必须为IComparable<X>IComparable,或者必须使用构造函数重载创建SortedSet<X>,这允许您提供类型为IComparer<X>的自定义对象。

这两个SortedSet<int>中的哪一个首先出现:

{ 3, 8, 25, }

或:

{ 3, 7, 9, 58, 12345678, }

补充:由于没有上述答案,我认为你需要进行词典比较,这看起来有些自然。我写了这堂课:

class LexicographicComparer : Comparer<SortedSet<int>>
{
    public override int Compare(SortedSet<int> x, SortedSet<int> y)
    {
        if (x == null || y == null)
            return Default.Compare(x, y);

        int firstDifference = x.Zip(y, Comparer<int>.Default.Compare)
            .Where(n => n != 0).FirstOrDefault();
        if (firstDifference != 0)
            return firstDifference;

        return Comparer<int>.Default.Compare(x.Count, y.Count);
    }
}

该类继承自Comparer<>类并因此而实现IComparer<>接口。您在构造“嵌套”SortedSet时使用它,例如:

LexicographicComparer lc = new LexicographicComparer();
SortedSet<SortedSet<int>> sset1 = new SortedSet<SortedSet<int>>(lc);
SortedSet<SortedSet<int>> sset2 = new SortedSet<SortedSet<int>>(lc);