<id,object =“”>列表的最佳数据类型?

时间:2015-06-17 18:29:27

标签: c# performance

对于由<ID, object>组成的元组列表,性能方面的最佳数据类型是什么,这样ID不是唯一的?

例如:

1 tire
1 rim
1 spoke
2 buckle
2 flap
2 bag

选择ID = 1时会有什么效果?我有超过一百万行。

4 个答案:

答案 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

该帖子讨论了这种抽象的一些优点(主要是更简单的界面)。