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