SortedSet - пользовательский порядок при сохранении объекта класса

Я рассматриваю возможность замены HashSet на SortedSet, потому что он лучше подходит для данных, которые я храню.

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

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

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

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


person dotnetnoob    schedule 21.01.2015    source источник


Ответы (2)


Реализуйте 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);
    }
}
person Meirion Hughes    schedule 21.01.2015

Предполагая, что под «индексатором» вы подразумеваете «упорядочение», вы просто реализуете свой тип IComparable<Foo> и предоставляете метод CompareTo, который сравнивает дату в this с датой в другом Foo.

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

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

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

person Jon Skeet    schedule 21.01.2015
comment
Хороший момент в последнем абзаце - элементы добавляются в набор для каждого пользователя, поэтому в этом случае должно быть достаточно даты и времени. - person dotnetnoob; 21.01.2015
comment
@dotnetnoob: Это не обязательно — например, если это событие входа в здание, то один и тот же пользователь может войти в здание несколько раз в один и тот же день. Но я предполагаю, что дополнительный контекст, который у вас есть, делает это хорошо :) - person Jon Skeet; 21.01.2015