Skip to main content
Code Review

Return to Answer

replaced http://codereview.stackexchange.com/ with https://codereview.stackexchange.com/
Source Link

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:

Source Link
Jesse C. Slicer
  • 14.5k
  • 1
  • 40
  • 54

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);
 }
}
lang-cs

AltStyle によって変換されたページ (->オリジナル) /