This is a follow up on this question and has now a follow up question here.
I have implemented some changes to the class below and also added the method AddChildRange()
to the ArchiveTreeEntry
class.
I have kept the method as static
, as this method is the only purpose of this class, and none of the passed items will be changed.
I am a little bit unsure about the methodname RemoveChildren
.
Please review the class in question if you find anything which should be changed.
The class in question
public class ArchiveBuilder
{
public static IEnumerable<ArchiveTreeEntry> Build(IEnumerable<ArchiveDefinition> archiveDefinitions)
{
IEnumerable<ArchiveTreeEntry> rootArchiveTreeEntries = new List<ArchiveTreeEntry>();
if (archiveDefinitions != null && archiveDefinitions.Count() > 0)
{
IEnumerable<ArchiveDefinition> localEntries = new List<ArchiveDefinition>(archiveDefinitions);
rootArchiveTreeEntries = CreateRootEntries(localEntries);
localEntries = RemoveRootArchiveDefinitions(localEntries);
foreach (ArchiveTreeEntry rootEntry in rootArchiveTreeEntries)
{
HandleEntriesForParent(localEntries, rootEntry);
}
}
return rootArchiveTreeEntries;
}
private static IEnumerable<ArchiveTreeEntry> CreateRootEntries(
IEnumerable<ArchiveDefinition> archiveDefinitions)
{
List<ArchiveTreeEntry> rootEntries = new List<ArchiveTreeEntry>();
rootEntries.AddRange(
archiveDefinitions.Where(e => e.TypeOfArchive == ArchiveType.Archive)
.Select(d => new ArchiveTreeEntry(d)));
return rootArchiveTreeEntries;
}
private static IEnumerable<ArchiveDefinition> RemoveRootArchiveDefinitions(
IEnumerable<ArchiveDefinition> archiveDefinitions)
{
IEnumerable<ArchiveDefinition> newEntries =
archiveDefinitions.Except(
archiveDefinitions.Where(e => e.TypeOfArchive == ArchiveType.Archive));
return newEntries;
}
private static void HandleEntriesForParent(
IEnumerable<ArchiveDefinition> archiveDefinitions,
ArchiveTreeEntry parent)
{
if (archiveDefinitions.Count() > 0)
{
IEnumerable<ArchiveDefinition> children = GetChildren(archiveDefinitions, parent.Id);
AddChildrenToParent(parent, children);
RemoveChildren(archiveDefinitions, parent.Id);
foreach (ArchiveTreeEntry nextParent in parent.Children)
{
HandleEntriesForParent(archiveDefinitions, nextParent);
}
}
}
private static IEnumerable<ArchiveDefinition> GetChildren(
IEnumerable<ArchiveDefinition> archiveDefinitions, string parentId)
{
return archiveDefinitions.Where(e => e.ParentId == parentId);
}
private static void AddChildrenToParent(ArchiveTreeEntry parent,
IEnumerable<ArchiveDefinition> children)
{
parent.AddChildRange(children.Select(x => new ArchiveTreeEntry(x)));
}
private static void RemoveChildren(
IEnumerable<ArchiveDefinition> archiveDefinition,
string parentId)
{
archiveDefinition.Select(e => e.ParentId != parentId);
}
}
Related changed class
public class ArchiveTreeEntry
{
public ArchiveType ArchiveEntryType { get; private set; }
public string Id { get; private set; }
public ReadOnlyCollection<ArchiveTreeEntry> Children
{
get
{
return new ReadOnlyCollection<ArchiveTreeEntry>(mChildren);
}
}
private List<ArchiveTreeEntry> mChildren = new List<ArchiveTreeEntry>();
public ArchiveTreeEntry(ArchiveDefinition archiveDefinition)
{
Id = archiveDefinition.ArchiveNodeId;
ArchiveEntryType = archiveDefinition.TypeOfArchive;
}
internal void AddChild(ArchiveTreeEntry child)
{
if (child != null)
{
mChildren.Add(child);
}
}
internal void AddChildRange(IEnumerable<ArchiveTreeEntry> children)
{
if (children != null)
{
mChildren.AddRange(children);
}
}
}
EDIT: As the RemoveChildren
method doesn't do, what I thought it will do, please skip it in your review.