我知道这一定很简单,但我就是不能让它工作…我试图通过比较来自不同行的两列,并相应地将它们作为节点或叶来为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);我是否应该使用数组来存储每条记录并进行比较……我没主意了.我相信有更好的方法来实现这一点……请帮帮忙
发布于 2012-12-27 05:56:18
假设数据是您声明的方式,并且"parents“将出现在任何叶子之前,下面是我想出的创建树的一种方法:
截取不相关的代码
使用 Dictionary<string, List<TreeNode>>的更新: LINQ
我创建了一个新类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"}
};这是一个新方法,它基本上创建了两个列表,一个用于父列表,另一个用于叶列表。然后,我循环遍历树叶以找到任何匹配的父代,并将树叶添加到其中:
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()更有效
发布于 2012-12-27 06:09:59
你最好的选择可能是Linq --我创建了一个又快又脏的VB.Net解决方案,让你朝着正确的方向前进--主要部分是第二个Linq语句……
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim x As New List(Of City)
x.Add(New City With {.ListA = "NY", .ListB = "", .Leaf = "Parent1"})
x.Add(New City With {.ListA = "", .ListB = "NY", .Leaf = "Leaf1"})
x.Add(New City With {.ListA = "HI", .ListB = "", .Leaf = "Parent2"})
x.Add(New City With {.ListA = "AK", .ListB = "", .Leaf = "Parent3"})
tv1.Nodes.AddRange((From y In x Where y.ListA <> "" Select New TreeNode With {
.Name = y.ListA,
.Text = y.Leaf}).ToArray)
For Each nd As TreeNode In tv1.Nodes
Dim Nm As String = nd.Name
nd.Nodes.AddRange((From y In x Where y.ListB = Nm Select New TreeNode(y.Leaf)).ToArray)
Next
End Sub简单地说,您填充了父节点的第一个ste,然后循环遍历所有节点,并使用ListB =节点名称的任何节点填充它们。
希望这能帮助你朝着正确的方向前进
发布于 2012-12-27 21:56:25
..。我正在尝试用C#编写这段代码,但这段代码应该可以做到:
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;
foreach (City labelName in giveData)
{
if (MyData.ListA == labelName.ListB)
{// 2nd foreach
TreeNode node1 = new TreeNode();
node1.id = count++;
node1.name = labelName.labelName;
node1.leaf = true;
treeNode.Nodes.Add(node1);
}
}
myNode.Add(treeNode);
}
}
return JsonConvert.SerializeObject(myNode);希望这至少能让你朝着正确的方向前进。
https://stackoverflow.com/questions/14046584
复制相似问题