用于收集项目的最快集合,每个项目都包含要迭代的项目集合

时间:2013-07-15 13:57:36

标签: c# asp.net-mvc collections

我有一个小集合(大约10个项目),每个集合都有一个中等集合(从200到有时500)的项目链接(多对一关系,如果我是正确的)。

我正在寻找一种迭代这样的列表的方法:

var cardSetQry = from cs in mDb.CARD_SET
                 select cs;

List<CARD_SET> listCardSets = cardSetQry.ToList();

Dictionary<string, List<CARD>> cardsList = new Dictionary<string, List<CARD>>();

foreach (var cardSet in listCardSets)
{
    CARD_SET set = cardSet;    
    var cardQry = from c in mDb.CARD
                  where c.CARD_SET_IDE == set.CARD_SET_IDE
                  select c;

    if (cardQry.Any())
    {
        HashSet<CARD> listCards = new HashSet<CARD>(cardQry.ToList());    
        foreach (var card in listCards)
        {
            card.CARD_MASTER_IDE = null;
            card.CARD_CHILD_IDE = null;

            mDb.SaveChanges();
        }    
        cardsList.Add(set.CARD_SET_NAME, listCards);
    }
}

我正在使用dictionary,因为我需要卡片组名称和相关的对象列表,但我愿意接受建议。当应用程序启动时,此方法将被调用一次,并且必须遍历每个项目。

至于第二个列表(HashSet),我从上周开始使用它。小型研究让我相信hashSet是一种快速收集类型。但我不知道它是如何运作的。

所以,问题是:要实现我需要做的,最快的收藏品是什么,为什么?

2 个答案:

答案 0 :(得分:2)

令人怀疑的是,无论大小如何,您都会发现枚举HashSet<T>与枚举List<T>的速度存在显着差异。

您使用的应该取决于您将如何使用它。如果您希望能够快速确定集合中是否有某些内容,请使用HashSet。否则,请使用ListHashSet有其用途,但作为一个简单的顺序列表,它是过度的。它还使用的内存是List的3到4倍。

此外,在创建cardQry.ToList()时,HashSet有什么意义?你可以写new HashSet<CARD>(cardQry)

答案 1 :(得分:1)

在这么小的收集速度不是问题。如果您确实想将其映射为键值,则应使用Dictionary。否则只需使用Hashset。Comparison of Hashset list and dictionary