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

StackOverflow https://stackoverflow.com/questions/551901

Вопрос

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

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

  Dictionary<key, List<value>>

но это все еще сопряжено с некоторыми накладными расходами.Я хотел бы, чтобы в словаре было "Разрешить дубликаты".

Это было полезно?

Решение

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

Другие советы

.NET 2.0: PowerCollections ( Силовые коллекции ) содержит OrderedMultiDictionary.

Вы все еще можете использовать 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());

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

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

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

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

class MyComparer : IComparer<int>
{

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

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

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>>>();

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top