对于由<ID, object>
组成的元组列表,性能方面的最佳数据类型是什么,这样ID不是唯一的?
例如:
1 tire
1 rim
1 spoke
2 buckle
2 flap
2 bag
选择ID = 1
时会有什么效果?我有超过一百万行。
答案 0 :(得分:2)
我选择Dictionary<int, List<object>>
,这可以保证在按ID选择时快速查找。字典键必须是唯一的,但List
允许您在同一个键下放置多个对象。
答案 1 :(得分:1)
请参阅格洛芬德的回答 按键包含和查找是O(1)(或接近)所以这将是最佳速度
private Dictionary<int, List<object>> dl = new Dictionary<int, List<object>>();
private void AddDL(Int id, Object obj)
{
if(dl.ContainsKey(id))
dl[id].Add(obj);
else
dl.Add(id, new List<Object>{obj});
}
由于Int没有哈希冲突,我认为查找将为0(1)
List<Object> myObjs = dl[id];
如果您使用初始容量创建&gt;然后计算甚至dl.Add是O(1)
因此,如果您有超过100万的唯一ID,那么
private Dictionary<int, List<object>> dl = new Dictionary<int, List<object>>(1000000);
与List相同,所以可能想要从容量开始。
答案 2 :(得分:0)
您可以执行以下操作:
List<KeyValuePair<int, string>> stuff = new List<KeyValuePair<int, string>>();
// Populate list with some stuff
stuff.Add(new KeyValuePair<int, string>(1, "Asdf"));
stuff.Add(new KeyValuePair<int, string>(1, "wqer"));
stuff.Add(new KeyValuePair<int, string>(2, "fghj"));
stuff.Add(new KeyValuePair<int, string>(3, "vnbm"));
stuff.Add(new KeyValuePair<int, string>(1, "Asdf"));
// Use linq to get items with certain key
var results = stuff.Where(x => x.Key == 1).ToList();
我不能保证这是最快的方式...你可以使用排序列表,并可能节省一点处理器时间梳理结果。但是对于大多数应用程序来说,这样可以正常工作,因为List和其他容器类相对有效。
答案 3 :(得分:0)
有些人将此数据结构称为“MultiDictionary”。正如其他人所提到的,使用带有集合作为值类型的标准字典可以很容易地实现这一点。
或者,有一个可用的NuGet包(Microsoft实验集合),它添加了一个可以更直观地与之交互的抽象。它在以下帖子中描述: http://blogs.msdn.com/b/dotnet/archive/2014/06/20/would-you-like-a-multidictionary.aspx
该帖子讨论了这种抽象的一些优点(主要是更简单的界面)。