I'm a bit of a nut, and really like extension method syntax. So I employed some of mjolka's refactorings refactorings, put in a few minor ones of my own (primarily around variable naming) and provided an extension method veneer on top of it:
I'm a bit of a nut, and really like extension method syntax. So I employed some of mjolka's refactorings, put in a few minor ones of my own (primarily around variable naming) and provided an extension method veneer on top of it:
I'm a bit of a nut, and really like extension method syntax. So I employed some of mjolka's refactorings, put in a few minor ones of my own (primarily around variable naming) and provided an extension method veneer on top of it:
I'm a bit of a nut, and really like extension method syntax. So I employed some of mjolka's refactorings, put in a few minor ones of my own (primarily around variable naming) and provided an extension method veneer on top of it:
public static class ArchiveBuilder
{
public static IEnumerable<ArchiveTreeEntry> Build(this IEnumerable<ArchiveDefinition> archiveDefinitions)
{
archiveDefinitions = archiveDefinitions as IList<ArchiveDefinition> ?? archiveDefinitions.ToList();
if (!archiveDefinitions.Any())
{
return Enumerable.Empty<ArchiveTreeEntry>();
}
IEnumerable<ArchiveDefinition> localEntries = new List<ArchiveDefinition>(archiveDefinitions);
var rootArchiveTreeEntries = localEntries.CreateRootEntries().ToList();
localEntries = localEntries.GetNonRootArchiveDefinitions();
foreach (var rootEntry in rootArchiveTreeEntries)
{
localEntries.HandleEntriesForParent(rootEntry);
}
return rootArchiveTreeEntries;
}
private static IEnumerable<ArchiveTreeEntry> CreateRootEntries(
this IEnumerable<ArchiveDefinition> archiveDefinitions)
{
return archiveDefinitions
.Where(archiveDefinition => archiveDefinition.TypeOfArchive == ArchiveType.Archive)
.Select(archiveDefinition => new ArchiveTreeEntry(archiveDefinition));
}
private static IEnumerable<ArchiveDefinition> GetNonRootArchiveDefinitions(
this IEnumerable<ArchiveDefinition> archiveDefinitions)
{
return archiveDefinitions
.Where(archiveDefinition => archiveDefinition.TypeOfArchive != ArchiveType.Archive);
}
private static void HandleEntriesForParent(
this IEnumerable<ArchiveDefinition> archiveDefinitions,
ArchiveTreeEntry parent)
{
archiveDefinitions = archiveDefinitions as IList<ArchiveDefinition> ?? archiveDefinitions.ToList();
if (!archiveDefinitions.Any())
{
return;
}
var children = archiveDefinitions.GetChildren(parent.Id);
parent.AddChildrenToParent(children);
archiveDefinitions = archiveDefinitions.GetParentlessEntries(parent.Id);
foreach (var nextParent in parent.Children)
{
archiveDefinitions.HandleEntriesForParent(nextParent);
}
}
private static IEnumerable<ArchiveDefinition> GetChildren(
this IEnumerable<ArchiveDefinition> archiveDefinitions,
string parentId)
{
return archiveDefinitions.Where(e => e.ParentId == parentId);
}
private static void AddChildrenToParent(
this ArchiveTreeEntry parent,
IEnumerable<ArchiveDefinition> children)
{
parent.AddChildRange(children.Select(child => new ArchiveTreeEntry(child)));
}
private static IEnumerable<ArchiveDefinition> GetParentlessEntries(
this IEnumerable<ArchiveDefinition> archiveDefinitions,
string parentId)
{
return archiveDefinitions.Where(archiveDefinition => archiveDefinition.ParentId != parentId);
}
}