Подтвердить что ты не робот

Есть ли альтернатива Dictionary/SortedList, которая позволяет дублировать?

Возможный дубликат:
С# Сортировка коллекции, которая позволяет дублировать ключи

В принципе, я хотел бы сделать работу в словаре с дублирующимися ключами, не вдаваясь в пользовательские реализации сопоставления. Существует идея:

  Dictionary<key, List<value>>

но он все еще имеет некоторые накладные расходы. Я бы хотел, чтобы словарь имел "AllowDuplicates".

4b9b3361

Ответ 1

Если вы используете .NET 3.5, то Lookup, вероятно, то, что вам нужно.

Ответ 2

.NET 2.0: PowerCollections содержит OrderedMultiDictionary.

Ответ 3

Вы по-прежнему можете использовать SortedList и пытаться создать уникальный ключ, объединив свое значение и Guid в классе. В этом случае вы должны реализовать IComparer<NewKey> для своего нового ключа, например:

class MyKey
{
    public Guid Guid { get; set; }
    public float Value { get; set; }
}

class MyComparer : IComparer<MyKey>
{

    public int Compare(MyKey x, MyKey y)
    {
        if (x == null || y == null)
            throw new InvalidOperationException("both of parameters must be not null");
        if (x.Value < y.Value) return -1;
        if (x.Value > y.Value) return 1;
        return 0;
    }
}

а затем

var mySortedList = new SortedList<MyKey, MyValue>(new MyComparer());

Ответ 4

Не в Fx < 3.5. Вы можете реализовать один, очевидно, с помощью объектов Dictionary of IList. Но тогда у вас есть вопрос/ответственность за инкапсуляцию.

Если вы используете .NET 3.5, используйте класс Поиск.

Ответ 5

Это не работает. Как только вы вернете 0 из компаратора, он выкинет "дублирующее" исключение.

Вам не нужны инкапсуляция классов или что-то еще, просто сделайте сопоставитель, который не вернет результат 0 (равный). Ниже приведен пример типа int ключа

class MyComparer : IComparer<int>
{

  public int Compare(int x, int y)
  {
    if (x < y)
      return -1;
    else return 1;
  }
}

Ответ 6

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

var sortList = new SortedList<string, IDictionary<string, object>>();

но это не сработало.. поэтому я использовал

var list = new List<KeyValuePair<string, IDictionary<string, object>>>();

добавить к нему новые данные как..

list.Add(new KeyValuePair<string, IDictionary<string, object>>>(value, Dictionary));

с linq я отсортировал его без проблем..

Попробуйте List<KeyValuePair<TKey, List<TValue>>>();

Ответ 7

По определению словарь содержит уникальные ключи. Ваш пример выше - это действительно своего рода двумерный массив с ключами, структура, которую я использовал много раз. Зачем вам нужны дубликаты ключей? Если бы вы это сделали, как Словарь однозначно обратился бы к его членам?