为Treenode创建列表

Eag*_*Fox 7 c# asp.net-mvc treenode list extjs4

我知道这一定非常简单,但我无法让它工作......我试图通过比较不同行中的两列并相应地将它们作为节点或叶子来为extjs树创建一个List.这是我的样本数据

ListA  ListB  labelName
 NY           Parent1
        NY    Leaf1
 HI           Parent2
 AK           Parent3
Run Code Online (Sandbox Code Playgroud)

这是我的c#end ...所以当我匹配NY时,我应该将Parent1作为节点而Leaf1作为它的叶子而不是HI或AK ......但是这样做会把所有数据作为Parent ...即使是叶.

            SqlCommand cmd = con.CreateCommand();

            comd.CommandText = "SELECT * FROM myTable";
            con.Open();
            SqlDataReader reader = comd.ExecuteReader();
            while (reader.Read())
            {
                City MyData = new City();

                MyData.ListA = reader["ListA"].ToString().Trim();
                MyData.ListB = reader["ListB"].ToString().Trim();
                MyData.labelName = reader["labelName"].ToString().Trim();
                giveData.Add(MyData);
            }

            int count = 1;

            List<TreeNode> myNode = new List<TreeNode>();
            foreach (City MyData in giveData)
            {
                // 1st foreach
                    if (MyData.ListA != "")
                    {

                        TreeNode treeNode = new TreeNode();
                        treeNode.id = count++;
                        treeNode.name = MyData.labelName;
                        treeNode.leaf = false;

                        List<TreeNode> Level1 = new List<TreeNode>();
                        foreach (City labelName  in giveData)
                        {
                            if (labelName.ListA == labelName.ListB)
                            {// 2nd foreach
                                TreeNode node1 = new TreeNode();
                                node1.id = count++;
                                node1.name = labelName.labelName;
                                node1.leaf = true;

                                Level1.Add(node1);
                            }
                        }

                        treeNode.children = Level1;
                        myNode.Add(treeNode);
                }
            }
            return JsonConvert.SerializeObject(myNode);
Run Code Online (Sandbox Code Playgroud)

我应该使用数组存储每条记录并比较它们......我没有想法......我确信有更好的方法可以实现这一目标...请帮助

CAb*_*ott 3

假设数据是您所说的方式,并且“父母”将出现在任何叶子之前,这是我想出的创建树的单一通道:

[无关代码被剪掉]

更新:LINQ 使用Dictionary<string, List<TreeNode>>

我创建了一个新类 TreeNode 和一些用于测试的示例数据:

var MyData = new List<City>
                  {
                     new City {ListA = "AK", ListB = "", labelName = "Alaska"},
                     new City {ListA = "HI", ListB = "", labelName = "Hawaii"},
                     new City {ListA = "", ListB = "HI", labelName = "Hawaii Leaf 1"},
                     new City {ListA = "", ListB = "HI", labelName = "Hawaii Leaf 2"},
                     new City {ListA = "NY", ListB = "", labelName = "New York"},
                     new City {ListA = "", ListB = "NY", labelName = "New York Leaf 1"},
                     new City {ListA = "", ListB = "NY", labelName = "New York Leaf 2"}
                  };
Run Code Online (Sandbox Code Playgroud)

这是基本上创建 2 个列表的新方法,1 个用于父列表,1 个用于叶子列表。然后,我循环遍历叶子以找到任何匹配的父母并将叶子添加到其中:

var index = 0;
var parents = (from p in MyData
               where p.ListB == ""
               select p).ToDictionary(p => p.ListA, p => new TreeNode { id = index++, name = p.labelName, leaf = false });

var leaves = (from l in MyData
              where l.ListA == ""
              group l by l.ListB into stateGroup
              select stateGroup).ToDictionary(g => g.Key, g => g.ToList());

foreach (var leaf in leaves.Where(leaf => parents.ContainsKey(leaf.Key)))
{
    parents[leaf.Key].children =
        leaf.Value.Select(l => new TreeNode {id = index++, name = l.labelName, leaf = true}).ToList();
}

var myNode = parents.Select(p => p.Value).ToList();

return JsonConvert.SerializeObject(myNode);
Run Code Online (Sandbox Code Playgroud)

我认为这应该比使用列表和List.Find()