2013-08-19 4 views
0

У меня есть два SortedSets:SortedSet.Contains дает ошибку «по крайней мере, один объект должны реализовать ICombarable»

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 
    } 

Так ошибка я получаю аргумент Exception «, по крайней мере, один из них объекты должны реализовывать IComparable.

Я рассмотрел другие вопросы с той же проблемой, но в их случае они хотят сравнить свои классы. Я просто проверяю, находится ли определенный элемент в наборе. Так что да. Я понятия не имею, как это решить, любые указатели?

+0

Почему вы используете SortedSet из SortedSets? Будет ли и другая коллекция, которая не нуждается в IComparable в качестве ее содержимого? – FrankPl

+0

Полагаю, я мог бы изменить их на Hashset – Aelion

ответ

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); 

 Смежные вопросы

  • Нет связанных вопросов^_^