基本上我想使用重复键使Dictionary工作,而不需要进入自定义比较器实现。有一个想法:
Dictionary<key, List<value>>
但仍有一些开销。我希望词典有“AllowDuplicates”。
答案 0 :(得分:13)
如果你使用的是.NET 3.5,那么Lookup可能就是你所追求的。
答案 1 :(得分:7)
.NET 2.0:PowerCollections包含OrderedMultiDictionary
。
答案 2 :(得分:4)
您仍然可以使用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 :(得分:3)
不在Fx&lt; 3.5 ..显然,您可以使用IList对象的Dictionary来实现一个。但是你有封装问题/责任。
如果您使用的是.NET 3.5,请使用Lookup类。
答案 4 :(得分:3)
这不起作用。一旦从比较器返回0,它将抛出“重复”异常。
您不需要类封装或任何东西,只需使比较器不返回0(相等)结果。以下是int
类型键
class MyComparer : IComparer<int>
{
public int Compare(int x, int y)
{
if (x < y)
return -1;
else return 1;
}
}
答案 5 :(得分: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>>>();
答案 6 :(得分:0)
根据定义,Dictionary包含唯一键。上面的例子实际上是一种二维键控数组,这是我多次使用过的结构。你为什么要重复密钥?如果你这样做,那么Dictionary会如何唯一地解决其成员?