2015-01-21 2 views
1

Я ищу замену HashSet на SortedSet, потому что он лучше подходит для данных, которые я храню.SortedSet - заказ при хранении объекта класса

Однако все примеры, которые я видел до сих пор относятся к хранению простых объектов - INT-х, строки и т.д.

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

Вопрос в том, как я могу объявить пользовательский индекс для используемого набора, который переопределит поведение по умолчанию?

Заранее спасибо.

ответ

3

Внедрите IComparer и передайте его конструктору SortedSet;

См:

https://msdn.microsoft.com/en-us/library/dd395024%28v=vs.110%29.aspx

Например: Я использую этот

internal class SortedIndex 
{ 
    public double Comparable { get; set; } 
    public int Index { get; set; } 
} 

internal class SortedIndexComparar : IComparer<SortedIndex> 
{ 
    public int Compare(SortedIndex x, SortedIndex y) 
    { 
     return x.Comparable.CompareTo(y.Comparable); 
    } 
} 
1

Предполагая, что на "индексатор" вы имеете в виду "порядок", вы просто сделать свой тип реализации IComparable<Foo>, а также обеспечить CompareTo, который сравнивает дату в пределах this с другой стороны Foo.

Или вы можете реализовать IComparer<Foo> (с помощью метода Compare(Foo x, Foo y)) и передать его конструктору SortedSet.

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

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

+0

Хороший пункт в последнем абзаце - элементы добавляются к набору для каждого пользователя, поэтому в этом случае должно быть достаточно времени. – dotnetnoob

+0

@dotnetnoob: Это не обязательно обязательно - например, если это «событие входа в здание», то один и тот же пользователь может войти в здание несколько раз в ту же дату. Но я предполагаю, что дополнительный контекст, который у вас есть, все в порядке :) –

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