如何使用不同类型的集合联盟?

时间:2015-09-23 11:50:20

标签: c# linq

我的方法需要返回一个包含与settings.AgentIds对应的agent idssettings.LabelIds的集合。所以我决定使用Union

IEnumerable<IAgentsGroup> labelGroups = _agentsGroups.Values.Where(x => settings.LabelIds.Contains(x.Id));

IEnumerable<IEnumerable<Guid>> labelAgentIds = labelGroups.Select(x => x.AgentIds);

return labelAgentIds.Union(settings.AgentIds);

但我现在不知道如何将它组合成一个Collection<Guid>

beacuse settings.AgentIds的类型为Collection<Guid>labelAgentIds的类型为IEnumerable<IEnumerable<Guid>>

3 个答案:

答案 0 :(得分:3)

如果您满足于以显而易见的方式将IEnumerable<IEnumerable<Guid>>展平为IEnumerable<Guid>,那么SelectMany就是您的朋友:

IEnumerable<Guid> labelAgentIds = labelGroups.SelectMany(x => x.AgentIds);
return labelAgentIds.Union(settings.AgentIds);

尽管Select将输入中的每个元素映射到输出中的另一个元素,SelectMany将输入中的每个元素映射到中的任意数量元素输出(可能是0,可能是1,可能更多)。

答案 1 :(得分:1)

您可以使用SelectMany展平收藏集:

IEnumerable<Guid> labelAgentIds = labelGroups.SelectMany(x => x.AgentIds);

答案 2 :(得分:1)

我认为您要展开IEnumerable<Collection<Guid>>,然后使用SerlectMany

var allGuids = labelAgentIds.SelectMany(col => col).Union(settings.AgentIds);
Collection<Guid> result = new Collection<Guid>(allGuids.ToList());