Печать вложенных объектов в 2D - PullRequest
0 голосов
/ 24 марта 2020

У меня есть список объектов со списками дочерних объектов, которые также имеют списки дочерних объектов, и т. Д. c. Вот упрощение для объектов A и H:

Object Nesting

Я хотел бы распечатать их в двумерном массиве, например:

Pint Output

Но я продолжаю получать это:

Misaligned Printing

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

Есть ли у кого-нибудь псевдокод, который мог бы помочь мне решить проблемы с выравниванием?

List<int> levelStart = new List<int>();
    List<int> levelEnd = new List<int>();
    int tempEnding = 0;

    public void propertyValues2(Object inv, object[,] dataTest)
    {
        Type objType = inv.GetType();
        PropertyInfo[] properties = inv.GetType().GetProperties();
        foreach (PropertyInfo property in properties)
        {
            DisplayNameAttribute DNA = (DisplayNameAttribute)property.GetCustomAttributes(typeof(DisplayNameAttribute), false).FirstOrDefault();
            object propValue = property.GetValue(inv, null);
            var elems = propValue as System.Collections.IList;
            if (exportAll == true || exportColumns.Contains(DNA.DisplayName))
            {
                if (elems != null && elems.Count != 0)
                {                        
                    foreach (var item in elems)
                    {
                        if (!item.GetType().FullName.StartsWith("System.String"))
                        {
                            levelStart.Add(levelStart[levelStart.Count-1]);
                            propertyValues2(item, dataTest);
                            levelStart.RemoveAt(levelStart.Count - 1);
                        }
                        else if (exportColumns.Contains(DNA.DisplayName) || exportAll == true)
                        {
                            int counter = tempEnding;
                            if (dataTest[tempEnding, columnIDs[DNA.DisplayName]] != null)
                            {
                                //dataRow = level[0];
                                for (int di = tempEnding; dataTest[di, columnIDs[DNA.DisplayName]] != null; di++)
                                {
                                    tempEnding = di+1;
                                }
                            }
                            dataTest[tempEnding, columnIDs[DNA.DisplayName]] = item;
                            if (tempEnding > endingRow)
                            {
                                endingRow = tempEnding;
                            }
                        }
                    }
                    tempEnding = levelStart[levelStart.Count-1];
                    //dataRow = level[0];//level[0]
                }
                else if (elems != null && elems.Count == 0)
                {
                    int i = 0;
                }
                else if (propValue != null && propValue.ToString() != "")
                {
                    //dataRow = level[0];//level[0]
                    //int counter = level[level.Count-1];
                    if(DNA.DisplayName == "Procedure" || DNA.DisplayName == "Revenue Code")
                    {
                        if (columnIDs.Keys.Contains("Procedure") && columnIDs.Keys.Contains("Revenue Code"))
                        {
                            for (int di = tempEnding; dataTest[di, columnIDs["Procedure"]] != null || dataTest[di, columnIDs["Revenue Code"]] != null; di++)
                            {
                                tempEnding++;
                            }
                        }
                    }
                    if (dataTest[tempEnding, columnIDs[DNA.DisplayName]] != null)
                    {
                        for (int di = tempEnding; dataTest[di, columnIDs[DNA.DisplayName]] != null; di++)
                        {
                            tempEnding++;
                        }
                    }
                    dataTest[tempEnding, columnIDs[DNA.DisplayName]] = propValue.ToString();
                    if (tempEnding > endingRow)
                    {
                        endingRow = tempEnding;
                    }
                }
            }
            else if (elems != null && elems.Count != 0)
            {
                levelStart.Add(levelStart[levelStart.Count - 1]);
                foreach (var item in elems)
                {
                    if (!item.GetType().FullName.StartsWith("System.String"))
                    {
                        propertyValues2(item, dataTest);
                    }
                    else if (exportColumns.Contains(DNA.DisplayName) || exportAll == true)
                    {
                        int counter = levelStart[levelStart.Count - 1];
                        if (dataTest[counter, columnIDs[DNA.DisplayName]] != null)//level[level.Count - 1]
                        {
                            for (int di = levelStart[0]; dataTest[di, columnIDs[DNA.DisplayName]] != null; di++)
                            {
                                counter++;//level[level.Count - 1]
                            }
                        }
                        dataTest[counter, columnIDs[DNA.DisplayName]] = item;//level[level.Count - 1]
                        if (endingRow < counter)
                        {
                            endingRow = counter;
                        }
                    }
                    levelStart[levelStart.Count - 1] = endingRow + 1;
                }
                levelStart.RemoveAt(levelStart.Count - 1);
            }
        }
        foreach (string columnToCopy in columnsToCopy)
        {
            if (exportColumns.Contains(columnToCopy) || exportAll == true)
            {
                for (int i = levelStart[0] + 1; i <= endingRow; i++)//level[0]
                {
                    dataTest[i, columnIDs[columnToCopy]] = dataTest[i - 1, columnIDs[columnToCopy]];
                }
            }
        }
    }

Структура массива: Array Structure

1 Ответ

0 голосов
/ 26 марта 2020

Вот код, над которым я работал вчера. Кажется, он работает в моих тестовых прогонах, но я продолжу тестирование сегодня. Во время печати в нем слишком много изменений строк, поэтому я не совсем уверен, что он всегда печатается правильно:

    int startInvoice = 1;
    List<int> levelStart = new List<int> { 1 };
    List<int> levelEnd = new List<int> { 1 };
    List<int> maxWithinLevel = new List<int> { 0 };
    int depth = 0;

    public int propertyValues3(Object inv, object[,] dataTest)
    {
        //int maxWithinLevel = 0;
        PropertyInfo[] properties = inv.GetType().GetProperties();
        foreach (PropertyInfo property in properties)
        {
            DisplayNameAttribute DNA = (DisplayNameAttribute)property.GetCustomAttributes(typeof(DisplayNameAttribute), false).FirstOrDefault();
            object propValue = property.GetValue(inv, null);
            var elems = propValue as System.Collections.IList;
            //if its a list
            if (elems != null && elems.Count != 0)
            {
                levelStart.Add(levelEnd[levelEnd.Count - 1]);
                levelEnd.Add(levelStart[levelStart.Count - 1]);
                foreach (var item in elems)
                {
                    //if its a class
                    if (!item.GetType().FullName.StartsWith("System.String"))
                    {
                        depth++;
                        levelStart[levelStart.Count-1] = propertyValues3(item, dataTest);
                        depth--;
                        if (levelEnd[levelEnd.Count - 1] < levelStart[levelStart.Count - 1])
                        {
                            levelEnd[levelEnd.Count - 1] = levelStart[levelStart.Count - 1];
                        }
                    }
                    //if its a string
                    else
                    {
                        if (dataTest[levelEnd[levelEnd.Count - 1], columnIDs[DNA.DisplayName]] != null)
                        {
                            for (int i = levelEnd[levelEnd.Count - 1]; dataTest[i, columnIDs[DNA.DisplayName]] != null; i++)
                            {
                                levelEnd[levelEnd.Count - 1] = i + 1;
                            }
                        }
                        dataTest[levelEnd[levelEnd.Count - 1], columnIDs[DNA.DisplayName]] = item; //legit
                        if (levelEnd[levelEnd.Count - 1] > endingRow)//legit
                        {
                            endingRow = levelEnd[levelEnd.Count - 1];
                        }
                    }
                }
                levelStart.RemoveAt(levelStart.Count - 1);
                //if (!elems[0].GetType().FullName.StartsWith("System.String"))
                if(depth>0)
                {
                    maxWithinLevel.Add(levelEnd[levelEnd.Count - 1]);
                }
                levelEnd.RemoveAt(levelEnd.Count - 1);
            }
            //if elems is empty
            else if (elems != null && elems.Count == 0)
            {
                int i = 0;
            }
            //if it's not a list
            else if (propValue != null && propValue.ToString() != "")
            {
                //handle procedure/revcode
                if (DNA.DisplayName == "Procedure" || DNA.DisplayName == "Revenue Code")
                {
                    if (columnIDs.Keys.Contains("Procedure") && columnIDs.Keys.Contains("Revenue Code"))
                    {
                        for (int i = levelEnd[levelEnd.Count - 1]; dataTest[i, columnIDs["Procedure"]] != null || dataTest[i, columnIDs["Revenue Code"]] != null; i++)
                        {
                            levelEnd[levelEnd.Count - 1]++;
                        }
                    }
                }
                if (dataTest[levelEnd[levelEnd.Count - 1], columnIDs[DNA.DisplayName]] != null)
                {
                    for (int i = levelEnd[levelEnd.Count - 1]; dataTest[i, columnIDs[DNA.DisplayName]] != null; i++)//legit
                    {
                        levelEnd[levelEnd.Count - 1]++;
                    }
                }
                dataTest[levelEnd[levelEnd.Count - 1], columnIDs[DNA.DisplayName]] = propValue.ToString();//level[level.Count - 1]
                if (levelEnd[levelEnd.Count - 1] > endingRow)
                {
                    endingRow = levelEnd[levelEnd.Count - 1];
                }
            }
        }
        if (levelStart.Count==0 || levelStart.Max() < maxWithinLevel.Max())
        {
            return maxWithinLevel.Max() + 1;
        }
        else return levelStart.Max();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...