我知道这一定很简单,但我就是无法让它工作......我正在尝试通过比较来自不同行的两列并将它们相应地作为节点或叶子来为 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/