Разбор списка строк, содержащих разделитель для древовидной структуры - PullRequest
0 голосов
/ 20 марта 2019

Итак, у меня есть список строк вроде:

var drink = new List () {"Напитки", "*", "Ром", "Капитан Морган", "Кракен", "*", "Виски", "Laphroaig"}

Необходимо вернуть следующее:

* Напитки
* Напитки * Ром
* Напитки * Ром * Капитан Морган
* Напитки * Ром * Кракен
* Напитки * Виски
* Напитки * Виски * Laphroaig

Итак, как видно, каждый раз, когда встречается *, следующая строка будет считаться дочерней в корне. Итак, здесь Ром попадет под Напитки, а Капитан Морган и Кракен - под Ром. Виски попадал под напитки, а Лапроаиг - под виски.

Я знаю, что это должна быть какая-то древовидная структура, и единственное, что у меня сейчас есть, это:

private static Drink GroupDrinks(List<string> drinkNames)
{
        var drink = new Drink() { Children = new List<Drink>() };
        foreach (var drinkName in drinkNames)
        {
            if (drinkName != "*")
            {
                drink.Name = drinkName;
                drinkNames.RemoveAt(0);
            }
            else
            {
                drinkNames.RemoveAt(0);
                drink.Children.Add(GroupDrinks(drinkNames));
            }
        }
        return drink;
    }  

Я подумал, что мне нужно сделать какую-то рекурсию и, возможно, удалить символ, чтобы он не влиял на следующую итерацию, но это явно не работает. Любые советы будут великолепны.

1 Ответ

0 голосов
/ 20 марта 2019

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

Декларация:

 List<Drink> lstdrink = new List<Drink>();

        public List<FinalDrink> lstFinalDrink = new List<FinalDrink>();

Класс:

public class FinalDrink
        {
            public string name { get; set; }
        }
        public class Drink
        {
            public string name { get; set; }
            public int Tag { get; set; }
        }

Установите значение:

 public List<Drink> SetUpTheValue()
        {
            var drinks = new List<string> { "Drinks", " * ", "Rum", "Captain Morgan", "Kraken", " * ", "Whiskey", "Laphroaig" };
            var repl = drinks.Select(s => s.Replace('*', ' ')).ToList();
            string tag = string.Empty;
            Drink drk = new Drink();
            lstdrink = new List<Drink>();
            for (int i = 0; i < repl.Count; i++)
            {


                if (i == 0)
                {
                    drk = new Drink();
                    drk.name = repl[i];
                    drk.Tag = 1;
                    lstdrink.Add(drk);
                    tag = repl[i];
                    continue;
                }

                if (tag.Trim().Length == 0)
                {
                    drk = new Drink();
                    drk.name = repl[i];
                    drk.Tag = 2;
                    lstdrink.Add(drk);
                    tag = repl[i];
                    continue;
                }

                if (repl[i].ToString().Trim().Length > 0)
                {
                    drk = new Drink();
                    drk.name = repl[i];
                    drk.Tag = 0;
                    lstdrink.Add(drk);
                    tag = repl[i];
                }

                tag = repl[i];

            }
            return lstdrink;
        }

Групповые напитки:

public List<FinalDrink> GroupDrinks(List<Drink> drinkNames)
        {

            lstFinalDrink = new List<FinalDrink>();
            FinalDrink fDrink = new FinalDrink();
            var GetFirst = drinkNames.Where(x => x.Tag == 1).ToList();
            fDrink.name = GetFirst[0].name.ToString();
            lstFinalDrink.Add(fDrink);
            var Content = drinkNames.Where(x => x.Tag != 1).ToList();
            string itrVal = string.Empty;
            int prev = 0;
            string hcur = string.Empty;
            for (int i = 0; i < Content.Count(); i++)
            {
                if (Content[i].Tag == 2)
                {
                    hcur = GetFirst[0].name + " * " + Content[i].name;

                    fDrink = new FinalDrink();
                    itrVal = GetFirst[0].name + " * " + Content[i].name;
                    fDrink.name = itrVal;
                    lstFinalDrink.Add(fDrink);
                    prev = Content[i].Tag;
                    itrVal = string.Empty;

                }

                else
                {
                    fDrink = new FinalDrink();
                    itrVal = hcur + " * " + Content[i].name;
                    fDrink.name = itrVal;
                    lstFinalDrink.Add(fDrink);
                    prev = Content[i].Tag;
                    itrVal = string.Empty;
                }
            }

            return lstFinalDrink;
        }

Исполнение:

private void button1_Click(object sender, EventArgs e)
        {
            if (SetUpTheValue().Count() > 0)
            {
                GroupDrinks(lstdrink);
            }
        }

Возвращение GroupDrinks List<FinalDrink> это окончательный результат.

Это зависит от вас, чтобы изменить результат

Этот код вернет ожидаемый результат, как вы добавили сверху.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...