Ответ 1
Если вы используете .NET 3.5, то Lookup, вероятно, то, что вам нужно.
Возможный дубликат:
С# Сортировка коллекции, которая позволяет дублировать ключи
В принципе, я хотел бы сделать работу в словаре с дублирующимися ключами, не вдаваясь в пользовательские реализации сопоставления. Существует идея:
Dictionary<key, List<value>>
но он все еще имеет некоторые накладные расходы. Я бы хотел, чтобы словарь имел "AllowDuplicates".
Если вы используете .NET 3.5, то Lookup, вероятно, то, что вам нужно.
.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());
Не в Fx < 3.5. Вы можете реализовать один, очевидно, с помощью объектов Dictionary of 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;
}
}
Я столкнулся с той же проблемой.. Мне нужен был отсортированный список, который может разрешать дубликаты ключей.
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>>>();
По определению словарь содержит уникальные ключи. Ваш пример выше - это действительно своего рода двумерный массив с ключами, структура, которую я использовал много раз. Зачем вам нужны дубликаты ключей? Если бы вы это сделали, как Словарь однозначно обратился бы к его членам?