Создать иерархию объектов из списка местоположений папок - PullRequest
0 голосов
/ 01 июля 2011

У меня есть список местоположений в виде строк;

locA/locB
locA/locB/locH
locC/locD/locE
locC/locD/locE/locK
locF/locG

Я пытался создать объект, который использует ту же структуру, что и список местоположений, переданных ему;

Например, что-то вроде ..

var myHObject=CreateHeirarchicalObjectFromList(myStringListOfLocations);

У меня проблемы с циклическим перебором списка, почти не делая это вручную с множеством циклов.Есть ли более простой способ, может быть, рекурсия?

Я хочу получить такой объект;

.locA
    .locB
         .locH
.locC
    .locD
         .locE
              .locK
.locF
     .locG

, который я могу использовать для создания визуальной иерархии.

1 Ответ

0 голосов
/ 01 июля 2011

Вероятно, не самый лучший, но завис в LinqPad, переформатирует через секунду.

    void Main()
    {
        var strings = new string[]{"locA/locB","locA/locB/locH",
                         "locC/locD/locE","locC/locD/locE/locK","locF/locG"};

        var folders = Folder.Parse(strings);

        folders.Dump();
    }


    public class Folder
    {
        public string Name { get; set; }

        public List<Folder> Folders { get; internal set; }

        public Folder()
        {
            Folders = new List<Folder>();
        }
        //Presume that each string will be folder1/folder2/folder3
        public static IEnumerable<Folder> Parse(IEnumerable<string> locations)
        {
            var folders = new List<Folder>();
            foreach (string location in locations)
            {
                string[] parts = location.Split('/');
                Folder current = null;
                foreach (string part in parts)
                {
                    var useFolders = current != null ? 
                               current.Folders : folders;
                    current = useFolders.SingleOrDefault(f => f.Name == part) ?? new Folder() { Name = part };
                    if (!useFolders.Contains(current)) { useFolders.Add(current); }
                }
            }
            return folders;
        }
    }
...