SortedSet и SortedList не работают с различными перечислениями - PullRequest
2 голосов
/ 25 мая 2011

вся история;У меня есть несколько KeyValuePairs, которые мне нужно сохранить в сеансе, и моя основная цель - сохранить их маленькими.Поэтому у меня нет возможности использовать много разных коллекций.Хотя ключ является другим значением перечисления другого типа перечисления, значение всегда является просто значением перечисления того же типа перечисления.Я выбрал HashTable для этого подхода, содержимое которого выглядит следующим образом (только много больше):

// The Key-Value-Pairs
{ EnumTypA.ValueA1, MyEnum.ValueA },
{ EnumTypB.ValueB1, MyEnum.ValueB },
{ EnumTypC.ValueC1, MyEnum.ValueA },
{ EnumTypA.ValueA2, MyEnum.ValueC },
{ EnumTypB.ValueB1, MyEnum.ValueC }

Максимум, что я использую, содержит в этом HashTable, но наверняка мне также нужно получить значение в какой-то моменти мне нужно перебрать все элементы.Это все работает нормально, но теперь у меня есть новое требование, чтобы сохранить порядок, я добавил их в HashTable -> BANG

HashTable это карта, и это невозможно!

Теперь я подумал об использовании SortedList<object, MyEnum> или использовании большего количества данных, но с более быстрым поиском и использовании SortedSet<object> в дополнение к HashTable.

Содержание ниже было отредактировано

SortedList реализован как

SortedList<Enum, MyEnum> mySortedList = new SortedList<Enum, MyEnum>();

SortedSet реализован как

SortedSet<Enum> mySortedSet = new SortedSet<Enum>();

Описанный ключ - значение - пары добавляются в отсортированный список с помощью

void AddPair(Enum key, MyEnum value)
{
    mySortedList.Add(key, value);
}

И для SortedSett, подобного этому

void AddPair(Enum key)
{
    mySortedSet.Add(key);
}

Обе сбои, за исключением:

Объект должен быть того же типа, что и перечисление

Мой вопрос: Что идет не так и какя могу заархивировать свою цель?

Используемое решение

Я решил жить с недостатком избыточных данныхпротив медленных поисков и решил реализовать List<Enum>, который сохранит порядок вставки параллельно моему уже существующему HashTable.

В моем случае у меня просто есть около 50-150 элементов, поэтому я решил сравнитьHashtable против List<KeyValuePair<object,object>>

Поэтому я создал себе следующего помощника для реализации ContainsKey() вList<KeyValuePair<object,object>>

static bool ContainsKey(this List<KeyValuePair<object, object>> list, object key)
{
    foreach (KeyValuePair<object, object> p in list)
    {
        if (p.Key.Equals(key))
            return true;
    }
    return false;
}

Я вставил те же 100 записей и проверил случайным образом одну из десяти различных записей в цикле 300000.И ... разница была крошечной, поэтому я решил пойти с List<KeyValuePair<object,object>>

1 Ответ

3 голосов
/ 25 мая 2011

Я думаю, вы должны хранить свои данные в экземпляре List<KeyValuePair<Enum, MyEnum>> или Dictionary<Enum, MyEnum>.

SortedSet и SortedList являются общими, но ваши ключи - EnumTypeA / EnumTypeB, вам нужно указать общий T с их базовым классом (System.Enum), например:

SortedList<Enum, MyEnum> sorted = new SortedList<Enum, MyEnum>();

EDIT

Почему вы получили это исключение

SortedList и SortedSet используют внутренний компаратор, чтобы проверить, равны ли два ключа. Comparer<Enum>.Default будет использоваться в качестве компаратора, если вы не указали компаратор в конструкторе. К сожалению, Comparer<Enum>.Default не реализован, как вы ожидали. Выдает исключение, если два перечисления не одного типа.

Как решить проблему

Если вы не хотите использовать List<KeyValuePair<Enum, MyEnum>> и настаивать на использовании SortedLIst, вам нужно указать компаратор для конструктора, например так:

class EnumComparer : IComparer<Enum>
{
    public int Compare(Enum x, Enum y)
    {
        return x.GetHashCode() - y.GetHashCode();
    }
}

var sorted = new SortedList<Enum, MyEnum>(new EnumComparer());

Кстати, я думаю, вам нужно получить "порядок вставки"? Если это так, List<KeyValuePair<K,V>> - лучший выбор, потому что SortedSet предотвратит дублирование элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...