Есть ли альтернатива Dictionary / SortedList, которая допускает дубликаты?[дубликат]
-
23-08-2019 - |
Вопрос
Возможный Дубликат:
Сортируемая коллекция 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>>>();
По определению, Словарь содержит уникальные ключи.Приведенный выше пример фактически представляет собой своего рода двумерный массив с ключами, структуру, которую я использовал много раз.Зачем вам понадобились дубликаты ключей?Если бы вы это сделали, как бы Словарь однозначно обращался к своим членам?