C # древовидная структура данных, делающая вывод - PullRequest
0 голосов
/ 27 марта 2012

Я создал свою собственную древовидную структуру данных с помощью классов.Теперь я застрял с действительно основными вещами.Мне нужно сделать вывод файла с разделителями табуляции из данных в мой список <MainTreeNode>.
Я думаю, что рекурсия это единственный путь?!

Дерево - это N-дерево, и выводпервая строка в качестве заголовка, а остальные строки являются значениями.

Дерево:

  1. MSG (MainTreeNode)
    • MainParam (должен иметьprop NAME, не должен иметь prop VALUE)
      • SubParam1 (должен иметь prop NAME, должен иметь prop VALUE)
      • SubParam2 (должен иметь prop NAME, не должен иметь propЗНАЧЕНИЕ)
        • SubSubParam2.1 (должен иметь имя ИМЯ, должен иметь значение ЗНАЧЕНИЕ)
          и т. Д.

Или:

  1. Сообщение: Имя
    • Param1: ValueV1 (VALUE должно, потому что у него нет детей)
    • Параметр2
      • Параметр2.1: ЗначениеV2
      • Параметр2.2: Значение
        • Параметр2.2.1: ЗначениеВ3
        • Параметр2.2.2: Значение V4 ... и т. Д.

И вывод должен быть таким (первая строка - заголовок):

Param1|Param2/Param2.1|Param2/Param2.2/Param2.2.1|Param2/Param2.2/Param2.2.2  
ValueV1|ValueV2|ValueV3|ValueV4
...

Так что мне нужно, вероятно, List для заголовка и для значений, но я не знаю, как реализоватьчто рекурсивным способом (или любым другим).

Часть незавершенного кода:

public void PrintToTabFile(List<Message> messages, List<string> parameters)
    {
        foreach (string s in parameters)
        {
            using (StreamWriter streamWriter = new StreamWriter(@"C:\temp\" + s + ".xls"))
            { 
                streamWriter.Write("No.\tMsgName\tMsgData1\tMsgData2\tMsgData3");
                var msg = messages.Where(x => x.Parameters.Where(p => p.ParameterName == s).Count() == 1);

                List<string> headers = new List<string>();
                List<string> values= new List<string>();
                //... Stuck!!!
            }
        }
    }

    private void Recursion(Parameter parameter, List<string> headers, List<string> values)
    {
        if (parameter.SubParameters.Count == 0)
        {
            int index = headers.IndexOf(parameter.ParameterName);
            values[index] = parameter.ParameterValue;
        }
        else
        {
            foreach (Parameter p in parameter.SubParameters)
            {
                Recursion(p, headers, values);
                //and Stuck Probably here or before recursion call
            }
        }
    }

1 Ответ

0 голосов
/ 27 марта 2012

Я не буду утверждать, что я действительно знаю, о чем вы спрашиваете, но все же я сделаю это.Мне кажется, что это очень простая рекурсия для обхода древовидной структуры с каким-то странным выводом, пока вы это делаете.Попробуйте это так: 1. Создайте интерфейс для всех ваших классов, называемый INode.Этот интерфейс должен содержать типичные вещи, такие как List Children, INode Parent и т. Д. 2. Сделайте так, чтобы все ваши классы реализовали этот интерфейс (или позволили им наследовать базовый класс, который делает это) 3. Теперь начните с вашего базового выражения и рекурсивно пройдитесь по всем дочерним элементам.используя свойство Children и сгенерируйте ваш вывод.

Это должно сработать, я думаю.(Извините, здесь нет VS, чтобы поставить какой-нибудь реальный код)

Кстати: вы, вероятно, уже найдете тонну сообщений об этом в stackoverflow.

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