可能有重复:
C#允许重复键的可排序集合
基本上,我想让一个字典支持重复的键,而不需要使用自定义比较器实现。有一个想法是:
Dictionary<key, List<value>>
但它仍然有一些开销。我希望字典有 "AllowDuplicates"。
可能有重复:
C#允许重复键的可排序集合
基本上,我想让一个字典支持重复的键,而不需要使用自定义比较器实现。有一个想法是:
Dictionary<key, List<value>>
但它仍然有一些开销。我希望字典有 "AllowDuplicates"。
您仍然可以使用 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版本中,您可以使用IList对象的Dictionary来实现。但这会带来封装问题和责任。
如果您使用的是.NET 3.5,则可以使用Lookup类。
Dictionary
的替代品,而不是SortedList
的替代品。 - Roman Starkov这样做是不行的。一旦从比较器中返回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>>>();