110,535
社区成员
发帖
与我相关
我的任务
分享
Recurrence(T node)
{
foreach (nodeEach in node.Nodes )
{
委托事件ing
Recurrence(nodeEach )
委托事件ed
}
}
class Tree<T>
{
public Node<T> root;
}
class Node<T>
{
public T value;
public List<Node<T>> children;
}
public static class Linq
{
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
{
foreach (var x1 in source)
{
yield return x1;
var res = selector(x1);
foreach (var re in res)
{
yield return re;
}
}
}
}
调用
TreeView tv = new TreeView();
TreeNode node1 = new TreeNode("A");
TreeNode node2 = new TreeNode("A1");
node1.Nodes.Add(node2);
tv.Nodes.Add(node1);
var nodes = tv.Nodes.Cast<TreeNode>();
var Flatten_nodes= nodes.Flatten(p => p.Nodes.Cast<TreeNode>());
//打印所有的
foreach (var flattenNode in Flatten_nodes)
{
Console.WriteLine(flattenNode.Text);
}
你看这个调用过程,我们压根就不关心他是treeview还是treenode,我只是需要
odes.Flatten(p => p.Nodes.Cast<TreeNode>()).
你告诉我怎么找到下一级的IEnumerable<TreeNode> static void Main(string[] args)
{
//初始化T
User user = new User() { Name = "tyler", Age = 2 };
//创建node,并且实现act委托
Node<User> node = new Node<User>();
node.data = user;
node.act = (x) => Console.WriteLine($"{x.Name}--{x.Age}");
//调用
node.ToDo(); //tyler--2
//创建 child
User user1 = new User() { Name = "t1", Age = 10 };
Node<User> node1 = new Node<User>();
node1.data = user1;
node.Child = node1;
node.Child.ToDo(); //t1--10
Console.ReadLine();
}
public class Node<T>
{
public int Key { get; set; }
public string Value { get; set; }
public T data { get; set; }
private Node<T> child;
public Node<T> Child
{
get { return child; }
set
{
child = value;
//默认赋值act动作
if (child.act == null)
child.act = act;
}
}
public Action<T> act;
public void ToDo()
{
if (act != null)
act(data);
}
}
public static IEnumerable<Node<T>> Hierarchize<T, TKey, TOrderKey>(
this IEnumerable<T> elements,
TKey topMostKey,
Func<T, TKey> keySelector,
Func<T, TKey> parentKeySelector,
Func<T, TOrderKey> orderingKeySelector)
{
var families = elements.ToLookup(parentKeySelector);
var childrenFetcher = default(Func<TKey, IEnumerable<Node<T>>>);
childrenFetcher = parentId => families[parentId]
.OrderBy(orderingKeySelector)
.Select(x => new Node<T>(x, childrenFetcher(keySelector(x))));
return childrenFetcher(topMostKey);
}
public class Node<T>
{
public T Value { get; private set; }
public IList<Node<T>> Children { get; private set; }
public Node(T value, IEnumerable<Node<T>> children)
{
this.Value = value;
this.Children = new List<Node<T>>(children);
}
}
其实就有些脱裤子的意思,先聚合到自己的临时Node<T>里,然后在写临外一个Cast 或makeXXXXTree方法在遍历和转换(当然你叫外观模式可以,你想弄成所谓的访问者模式也随便你)public static class Linq
{
public static IEnumerable<T> Flatten<T>(this T source, Func<T, IEnumerable<T>> selector)
{
return selector(source).SelectMany(c => Flatten(c, selector))
.Concat(new[] { source });
}
}
看明白了么,我们不关心啥tree,啥nodes,我们关心的是 hierarchical 层级数据,Flatten 扁平查询public class TreeNode<T>
{
public string Name {get;set;}
public T Data {get;set}
public TreeNode<T> LeftChild {get;set}
public TreeNode<T> RightChild {get;set}
//其他方法和属性
}