Building tree structure based on flat objects - second follow up
As long as the underlying object is a ICollection or ICollection&lt;T&gt; the Count() method returns the Count property of the underlying object.


That's correct, but since your parameter has type IEnumerable&lt;T&gt;, and the method is public, you have no guarantee that the underlying collection is an ICollection&lt;T&gt;. Even in non-public methods, if you assume the underlying collection is an ICollection&lt;T&gt;, your method signature should reflect that; if you decide to accept the more generic IEnumerable&lt;T&gt;, then you should use Any(). Otherwise you have hidden assumptions throughout your code that the type system cannot help with.



Use of the var keyword would clean things up considerably.



In this code


private static IEnumerable&lt;ArchiveTreeEntry&gt; CreateRootEntries(
    IEnumerable&lt;ArchiveDefinition&gt; archiveDefinitions)
{
    List&lt;ArchiveTreeEntry&gt; rootArchiveTreeEntries = new List&lt;ArchiveTreeEntry&gt;();

    rootArchiveTreeEntries.AddRange(
        archiveDefinitions.Where(e =&gt; e.TypeOfArchive == ArchiveType.Archive)
            .Select(d =&gt; new ArchiveTreeEntry(d)));

    return rootArchiveTreeEntries;
}



there's no point creating a List&lt;T&gt;, you can just write

private static IEnumerable&lt;ArchiveTreeEntry&gt; CreateRootEntries(
    IEnumerable&lt;ArchiveDefinition&gt; archiveDefinitions)
{
    return archiveDefinitions.Where(e =&gt; e.TypeOfArchive == ArchiveType.Archive)
        .Select(d =&gt; new ArchiveTreeEntry(d));
}




Similarly, you can write


private static IEnumerable&lt;ArchiveDefinition&gt; GetNonRootArchiveDefinitions(
    IEnumerable&lt;ArchiveDefinition&gt; archiveDefinitions)
{
    IEnumerable&lt;ArchiveDefinition&gt; remainingEntries =
            archiveDefinitions.Except(
            archiveDefinitions.Where(e =&gt; e.TypeOfArchive == ArchiveType.Archive));

    return remainingEntries;
}



as

private static IEnumerable&lt;ArchiveDefinition&gt; GetNonRootArchiveDefinitions(
    IEnumerable&lt;ArchiveDefinition&gt; archiveDefinitions)
{
    return archiveDefinitions.Where(e =&gt; e.TypeOfArchive != ArchiveType.Archive);
}