【问题标题】:Print Nested Objects in 2D以 2D 形式打印嵌套对象
【发布时间】:2020-07-04 14:12:18
【问题描述】:

我有一个对象列表,其中包含子对象列表,这些子对象列表也有子对象列表等。这是对象 A 和 H 的简化:

我想将它们打印成二维数组,如下所示:

但我不断得到这个:

我是第一次使用递归,因此很难跟踪我所在的嵌套级别的哪一行。我使用的代码杂乱无章,所以我很犹豫是否要发布它。

有人有一些伪代码可以帮助我解决对齐问题吗?

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]];
                }
            }
        }
    }

数组结构:

【问题讨论】:

  • 你是在控制台打印出来的吗?
  • 发送到 Excel,但先格式化为数组(以便快速转换到 Excel)
  • 用字典可能更容易写
  • 好吧,我正在循环数以千计的对象中的数十个字符串和列表属性并将它们全部打印到一个表中,所以我不确定字典是否可以工作。
  • 你能告诉我你的阵列吗?

标签: c# arrays object recursion


【解决方案1】:

这是我昨天编写的代码。它似乎在我的测试运行中有效,但我今天将继续测试。它在打印时有太多行更改,我无法跟踪,所以我不完全确定它是否总是正确打印:

    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();
    }

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 2013-01-20
    • 2021-05-06
    • 2012-09-11
    • 2022-11-25
    相关资源
    最近更新 更多