c# - 为树节点创建列表

标签 c# asp.net-mvc list extjs4 treenode

我知道这一定很简单,但我就是无法让它工作......我正在尝试通过比较来自不同行的两列并将它们相应地作为节点或叶子来为 extjs 树创建一个列表.这是我的示例数据

ListA  ListB  labelName
 NY           Parent1
        NY    Leaf1
 HI           Parent2
 AK           Parent3

这是我的 C# 端...所以当我匹配 NY 时,我应该将 Parent1 作为节点,将 Leaf1 作为其叶节点,而不是 HI 或 AK...但是这样做会将所有数据作为父节点抛出。 . 甚至叶子。

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

我是否应该使用数组来存储每条记录并比较它们......我没有想法......我相信有更好的方法来完成这个......请帮助

最佳答案

假设数据是您陈述的方式,并且“ parent ”将在任何叶子之前出现,这是我想出的创建树的单 channel 方式:

[无关代码被截断]

更新: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"}
                  };

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

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

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

关于c# - 为树节点创建列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14046584/

相关文章:

Python 两个列表之间的通配符匹配

c# - 如何选择声音设备播放声音?

jquery - 为什么ajax显示DateTime格式错误 "/Date(1493818989603)/"?

.net - ASP.Net MVC 布局页面定义了以下部分但还没有渲染

java - 如何将字符串解析回 map 列表

c++ - C++列表中最常见的元素,STL?

c# - 使用 SendMessage 拖放

c# - 这个函数如何改变我的只读变量?

c# - 如何强制浏览器使用版本控制重新加载缓存的静态文件?

jQuery ajax 请求不会在后续事件中触发