0

我有两个 SortedSet:

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

后来我检查我做了一个新的排序集:

 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。

我已经查看了具有相同问题的其他问题,但在他们的情况下,他们想比较自己的课程。我只是在检查某个项目是否在 Set 中。所以是的..我不知道如何解决这个问题,任何指针?

4

1 回答 1

0

除非您指定自定义比较器,否则您不能拥有 a SortedSetof s,因为它本身不会实现。SortedSetSortedSetIComparable

每当您使用该类型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<>接口。您在构建 "nested" 时使用它SortedSet,例如:

LexicographicComparer lc = new LexicographicComparer();
SortedSet<SortedSet<int>> sset1 = new SortedSet<SortedSet<int>>(lc);
SortedSet<SortedSet<int>> sset2 = new SortedSet<SortedSet<int>>(lc);
于 2013-08-19T18:17:05.590 回答