我有一个小集合(大约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是一种快速收集类型。但我不知道它是如何运作的。
所以,问题是:要实现我需要做的,最快的收藏品是什么,为什么?
答案 0 :(得分:2)
令人怀疑的是,无论大小如何,您都会发现枚举HashSet<T>
与枚举List<T>
的速度存在显着差异。
您使用的应该取决于您将如何使用它。如果您希望能够快速确定集合中是否有某些内容,请使用HashSet
。否则,请使用List
。 HashSet
有其用途,但作为一个简单的顺序列表,它是过度的。它还使用的内存是List
的3到4倍。
此外,在创建cardQry.ToList()
时,HashSet
有什么意义?你可以写new HashSet<CARD>(cardQry)
。
答案 1 :(得分:1)
在这么小的收集速度不是问题。如果您确实想将其映射为键值,则应使用Dictionary。否则只需使用Hashset。Comparison of Hashset list and dictionary