我有以下算法来找到两个集合的并集。
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);
如果您知道
labelAgentIds
和settings.AgentIds
从来没有相同的id,则可以使用Concat
或使用Union
来确保没有重复。settings.AgentIds = new Collection<Guid>(labelAgentIds.Union(settings.AgentIds).ToList())
使用
Aggregate
方法会比较慢。