如何有效地联合两个集合?

时间:2015-09-25 11:06:50

标签: c# .net algorithm linq

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

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));

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

1 个答案:

答案 0 :(得分:5)

为了获得最佳效果,请将alert放入settings.LabelIds

HashSet

然后使用hashset进行快速查找O(1)

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

如果您知道var labelAgentIds = _agents.Where(x => labelIds.Contains(x.Id)).SelectMany(x => x.AgentIds); labelAgentIds永远不会拥有相同的ID,则可以使用settings.AgentIds,否则请使用Concat以确保没有重复。

Union

使用settings.AgentIds = new Collection<Guid>(labelAgentIds.Union(settings.AgentIds).ToList()) 方式会更慢。