解释下下面这段代码
        public static TableInfo HtmlTableToObjectNew(string str)//Html格式
        {
            try
            {
                HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
                doc.LoadHtml(str);
                var nodeTotal = doc.DocumentNode.SelectSingleNode("//table");
                //Console.WriteLine(nodeTotal.OuterHtml);
                TableInfo tableInfo = new TableInfo();
                tableInfo.列表 = new List<TableInfo.字段>();
                tableInfo.角色 = new List<string>();

                if (nodeTotal != null)
                {
                    var nodes = nodeTotal.SelectNodes(".//tr");
                    //dataTable.Columns.Add(node)
                
                    tableInfo.部门 = nodes[0].SelectNodes(".//td")[0].InnerText;//部门

                    //字段部分
                    var firstRowColumns = nodes[0].SelectNodes(".//td");//第一行
                    for (int i = 2; i < firstRowColumns.Count; i++)//第三列开始
                    {
                        tableInfo.列表.Add(new TableInfo.字段() { name = firstRowColumns[i].InnerText });
                        Console.WriteLine(firstRowColumns[i].InnerText);
                    }

                    //角色部分
                    for (int i = 2; i < nodes.Count; i++)//从第三行开始
                    {
                        var rowColumns = nodes[i].SelectNodes(".//td");
                        tableInfo.角色.Add(rowColumns[0].InnerText);
                    }

                    //权限部分
                    for (int i = 2; i < nodes.Count; i++)//第三行开始
                    {
                        var rowColumns = nodes[i].SelectNodes(".//td");
                        for (int j = 1; j <= rowColumns.Count-1; j = j + 3) //第二列开始
                        {
                            if (j == 59)
                            {

                            }
                            int IndexOfList = (int)Math.Floor((j - 1) / 3.0);//从第三列开始
                            //Console.WriteLine(j);
                            TableInfo.字段 字段 = tableInfo.列表[IndexOfList];//取对应的列 每2列一项
                            字段.编辑列表.Add(new TableInfo.编辑项() { 查看 = rowColumns[j].InnerText, 编辑 = rowColumns[j + 1].InnerText, 主管 = rowColumns[j + 2].InnerText });
                            if(字段.name== "异常结案")
                            {

                            }
                            Console.WriteLine(字段.name);
                            Console.WriteLine(rowColumns[j].InnerText);
                            Console.WriteLine(rowColumns[j + 1].InnerText);
                            Console.WriteLine(rowColumns[j + 2].InnerText);
                        }
                    }
                }

                //处理
                foreach (var item in tableInfo.列表)
                {
                    for (int i = 0; i < item.编辑列表.Count; i++)
                    {
                        if (item.编辑列表[i].查看.Trim() != "")
                        {
                            item.编辑列表[i].查看 = tableInfo.角色[i];
                        }
                        if (item.编辑列表[i].编辑.Trim() != "")
                        {
                            item.编辑列表[i].编辑 = tableInfo.角色[i];
                        }
                        if (item.编辑列表[i].主管.Trim() != "")
                        {
                            item.编辑列表[i].主管 = tableInfo.角色[i];
                        }
                    }
                }

                return tableInfo;
            }
            catch (Exception ee)
            {
                Console.WriteLine("==========" + ee.Message);
                return null;
            }

        }