2013-11-16 3 views
2

Рассмотрите этот классСортировать SortedSet член элемента

public class A 
{ 
    float Order 
    string Name 
    public A(float order, string name) 
    { 
      Order = order; 
      Name = name; 
    } 
} 

Если бы я добавить это SortedSet<A> как бы это знать, какой член заказать его? Как бы это определить, если я даже могу в первую очередь. Я полагаю, что лучшая производительность набора будет сортировать его по добавлению, а не добавлять затем сортировку по Sort().

ответ

4

SortedSet<A> ожидает, что ваш класс будет реализован IComparable<A>. В качестве альтернативы, Вы можете поставить компаратор типа IComparer<A> сделать заказ извне к классу, как это:

class ComparerForClassAByOrder : IComparer<A> { 
    public int Compare(A left, A right) { 
     return Math.Sign(left.Order-right.Order); 
    } 
} 

class ComparerForClassAByName : IComparer<A> { 
    public int Compare(A left, A right) { 
     return left.Name.CompareTo(right.Name); 
    } 
} 

Теперь вы можете создать два отсортированных наборов с использованием различных компараторов:

var soredByOrder = new SortedSet<A>(new ComparerForAByOrder()); 
var soredByName = new SortedSet<A>(new ComparerForAByName()); 
+0

ОК, новый выпуск, скажем, я хочу создать два SortedSets, один закажет 'Order', другой -' Name', я предполагаю, что это будет невозможно, поскольку вы можете наследовать только «IComparable'once: ( – redcodefinal

+0

@redcodefinal, в этом случае реализуем несколько конкретных типов IComparer (для каждого желаемого заказа). – elgonzo

+0

@elgonzo спасибо, обязательно посмотрите! Спасибо за помощь dasblinkenlights. – redcodefinal

1

Если предположить, что вы изменить доступность, так что вы можете прочитать членов A извне класса, вы можете просто сделать:

new SortedSet<A>(Comparer<A>.Create((a1, a2) => a1.Order.CompareTo(a2.Order))) 

Для этого требуется .NET 4.5 или новее.

Помните, что NaN будет сравнивать меньшее, чем все остальное.

Если вы не проходите в собственном компаратороме конструктору, будет проверен, если каждый экземпляр A относится к типу времени выполнения, который реализует IComparable<> или IComparable. Если нет, возникает ошибка при добавлении к SortedSet<A>.

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