0

我有一个小集合(大约 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 是一种快速的集合类型。但我不知道它是如何工作的。

所以,问题是:为了实现我需要做的事情,使用最快的集合是什么,为什么?

4

2 回答 2

2

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

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

另外,cardQry.ToList()创建您的HashSet? 你可以只写new HashSet<CARD>(cardQry)

于 2013-07-15T14:16:40.973 回答
1

在这么小的采集速度下不是问题。如果你真的想将它映射为键值,你应该使用 Dictionary。否则,只需使用 Hashset。Hashset列表和字典的比较

于 2013-07-15T14:04:11.977 回答