如何有效地合并两个集合

本文关键字:两个 集合 有效地 合并 | 更新日期: 2023-09-27 18:14:28

我有以下算法来查找两个集合的并集

IEnumerable<IGroup> labelGroups = _agents.Where(x => settings.LabelIds.Contains(x.Id));
IEnumerable<Guid>labelAgentIds = labelGroups.SelectMany(x => x.AgentIds);
settings.AgentIds = new Collection<Guid>(labelAgentIds.Union(settings.AgentIds).ToList());

IEnumerable<IGroup> labelGroups = _agents.Where(x => settings.LabelIds.Contains(x.Id));
agentIds = labelGroups.Aggregate(agentIds, (current, label) => current.Union(label.AgentIds));

我应该用哪一个?帮我比较一下这些算法(速度和内存)

如何有效地合并两个集合

为了获得最佳性能,首先将settings.LabelIds放入HashSet

var labelIds = new HashSet<int>(settings.LabelIds);

然后使用哈希集进行快速查找O(1)

var labelAgentIds = _agents.Where(x => labelIds.Contains(x.Id)).SelectMany(x => x.AgentIds);

如果你知道labelAgentIdssettings.AgentIds从来没有相同的Id,你可以使用Concat,否则使用Union,以确保没有重复。

settings.AgentIds = new Collection<Guid>(labelAgentIds.Union(settings.AgentIds).ToList())

使用Aggregate的方式会更慢。