更快地枚举嵌套对象

时间:2013-10-01 12:52:42

标签: c#

我有一个问题,如果有可能以“更漂亮”的方式设置我的嵌套对象:

foreach (EntityOpportunity opt in entAccount.Opportunities)
{
    foreach (EntityActivityPointer activity in opt.Activities)
    {
        condRegardingObjectId.Values.Add(activity.Id);
    }
}

每个商机实体都有一个活动列表,我只需要Id。

祝你好运

5 个答案:

答案 0 :(得分:5)

当然,请使用SelectMany

var IDs = entAccount.Opportunities
                    .SelectMany(opt => opt.Activities, (opt, act) => act.Id);

由于你没有指定condRegardingObjectId是什么,我猜是要知道如何整体导入值集合(类似AddRange)?

答案 1 :(得分:3)

你拥有的东西没有错。当然,像SelectMany / Select这样的东西可以把它放到更少的行上,但这会产生开销(委托创建,而不能使用自定义迭代器) - foreach 可以使用自定义迭代器,并且所有IL都在一个地方。)

坦率地说,我唯一要做的就是首先抓住目标:

var list = condRegardingObjectId.Values;
foreach(EntityOpportunity opt in entAccount.Opportunities) {
    foreach(EntityActivityPointer activity in opt.Activities) {
        list.Add(activity.Id);
    }
}

答案 2 :(得分:1)

如果您只想要活动的ID,您可以使用Linq:

var activityIds = entAccount.Opportunities.SelectMany(p=>p.Activities).Select(p=>p.Id);

答案 3 :(得分:0)

用于List T对象:

entAccount.Opportunities.ForEach(opt => opt.Activities.ForEach(activitiy => condRegardingObjectId.Values.Add(activity.Id)));

答案 4 :(得分:0)

只是猜测你的物体:

                    foreach (EntityActivityPointer activity in entAccount.Opportunities.SelectMany(opt => opt.Activities))
                    {
                        condRegardingObjectId.Values.Add(activity.Id);
                    }