2015-09-23 60 views
1

我的方法将需要返回一个集合,其中包含对应于settings.LabelIdssettings.AgentIdsagent ids。所以我决定用Union如何将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>

怎么一回事,因为settings.AgentIds的类型为Collection<Guid>labelAgentIds具有IEnumerable<IEnumerable<Guid>>类型?

+0

可能重复[拼合的IEnumerable >;理解泛型](http://stackoverflow.com/questions/9440497/flatten-ienumerableienumerable-understanding-generics) –

回答

3

如果你满足于仅仅压扁IEnumerable<IEnumerable<Guid>>到明显的方式一个IEnumerable<Guid>,然后SelectMany是你的朋友:

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

Select将输入中的每个单元映射到输出中的另一个单元,SelectMany将输入中的每个单元映射到输出中的任何数字(可能是0,也许是1,也许更多)。

+0

伟大的解决方案。 –

1

您可以使用SelectMany扁平化集合:

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

我想你想拼合IEnumerable<Collection<Guid>>,然后使用SerlectMany

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