I have a recursive statement that removesactivities
that don't have a resource type
for a certain OrganizationID
. I was wondering if there was a better way to do this where I can eliminate some of the for loops
and use a little more linq
private IEnumerable<SubProjectDto> GetProjectAndActivitiesForByOrg(IEnumerable<SubProjectDto> children, Guid? organiazaitonId)
{
var subProjects = new List<SubProjectDto>();
subProjects.AddRange(children);
for (var i = 0; i < subProjects.Count; i++)
{
var activities = new List<ActivityDto>();
activities.AddRange(subProjects[i].Activities);
for (var j = 0; j < activities.Count; j++)
{
var resourceTypesForOrgs = activities[j].ActivityPersons.Where(x => x.ResourceType.OrganizationId == organiazaitonId).Count();
if (resourceTypesForOrgs == 0)
activities.Remove(activities[j]);
}
subProjects[i].Activities = activities;
if (subProjects[i].Children.Any())
GetProjectAndActivitiesForByOrg(subProjects[i].Children, organiazaitonId);
}
children = subProjects;
return children;
}
1 Answer 1
Here's my attempt. I assume, LINQ-method based approach is allowed by your problem statement.
I have not tested the code, so please cover it by unit test(s) which you may already have. Also, please notice that this is not a pure function in the functional sense of this term. It means, the method changes the state of the arguments passed in (which may or may not be desirable in different scenarios).
private IEnumerable<SubProjectDto> GetProjectAndActivitiesForByOrg(IEnumerable<SubProjectDto> children, Guid? organiazaitonId)
{
return children.Select(childSubProject =>
{
childSubProject.Activities.RemoveAll(activity =>
activity.ActivityPersons.All(person => person.ResourceType.OrganizationId != organiazaitonId));
// if (childSubProject.Children.Any()) // UPD: This check is not really required
GetProjectAndActivitiesForByOrg(childSubProject.Children, organiazaitonId);
return childSubProject;
});
}
-
1\$\begingroup\$ Thank you.I did have to make a slight adjustment but this worked quite well! \$\endgroup\$Train– Train2017年03月31日 16:38:15 +00:00Commented Mar 31, 2017 at 16:38
-
1\$\begingroup\$ @OrthoHomeDefense actually, you can even remove the line
if (childSubProject.Children.Any())
sincechildSubProject.Children
is guaranteed to be not null as I understand. That will make it one line shorter... (I updated the answer) \$\endgroup\$Igor Soloydenko– Igor Soloydenko2017年03月31日 16:40:11 +00:00Commented Mar 31, 2017 at 16:40