Search code examples
c#entity-frameworkrecursionparent-childnavigation-properties

Walking Parent/Child relation tree upwards


I've got a folder structure represented as a parent / child relation tree. Now let's imagine the following tree:

-- Folder1

--- Subfolder1-1

---- Subfolder1-1-1

--- Subfolder2

---- Subfolder2-1

-- Folder2

Now I obviously got navigation properties to use, so when inside Subfolder1-1 I got a property ParentFolder that represents Folder1.

How can I now walk up the tree to generate a concatenated string out of the folder names?

For example when calling this method from Subfolder1-1-1, I want the string to be Folder1.Subfolder1-1.Subfolder1-1-1 and when calling from Subfolder2-1, I want the string to be Folder1.Subfolder2.Subfolder2-1.

I've thought about recursion, but the following did not work:

public string GetCompleteFolderName(string delimiter)
{
    string folderName = null;

    if (FolderParent != null)
    {
        folderName += GetCompleteFolderName(FolderParent) + delimiter;
    }

    return folderName;
}

private string GetCompleteFolderName(Folder folder)
{
    string folderName = null;
    if (folder != null)
    {
        folderName = folder.Name;
    }

    return folderName;
}

Solution

  • Think this should do the trick

    public class Folder
    {
        public Folder ParentFolder { get; set; }
        public string Name { get; set; }
    
        public Folder()
        {
        }
        public string GetFullFolderName(string delimiter = ".")
        {
            var folderName = string.Empty;
            if (ParentFolder != null)
            {
                folderName += ParentFolder.GetFullFolderName(delimiter) + delimiter + Name;
            }
            else
            {
                folderName += Name;
            }
            return folderName;
        }
    }
    
    internal class Program
    {
        private static void Main(string[] args)
        {
            var f1 = new Folder {Name = "f1"};
            var f2 = new Folder {Name = "f2", ParentFolder = f1};
            var f3 = new Folder {Name = "f3", ParentFolder = f2};
    
            Console.WriteLine(f3.GetFullFolderName());
        }
    }
    

    outputs: f1.f2.f3