首页 > 代码库 > 一个简单的Linq to TreeNode
一个简单的Linq to TreeNode
最近两天写单元测试,碰到需要验证一个树是否是期望的,但是树这个结构要验证起来还真是有点烦。。。
我的树大概是这样的:
1 class TreeNode<T> 2 { 3 private static readonly TreeNode<T>[] Empty = new TreeNode<T>[0]; 4 public TreeNode() : this(default(T), Empty) { } 5 public TreeNode(T value, IReadOnlyList<TreeNode<T>> children) 6 { 7 Value =http://www.mamicode.com/ value; 8 Children = children; 9 }10 public T Value { get; set; }11 public IReadOnlyList<TreeNode<T>> Children { get; set; }12 }
为了判等,这个树实现了IEquatable<TreeNode<T>>接口:
1 public override bool Equals(object obj) 2 { 3 var other = obj as TreeNode<T>; 4 if (other == null) 5 { 6 return false; 7 } 8 return Equals(other); 9 }10 11 public bool Equals(TreeNode<T> other)12 {13 return object.Equals(Value, other.Value) && Children.SequenceEqual(other.Children);14 }15 16 public override int GetHashCode()17 {18 return Value.GetHashCode() ^ Children.Aggregate(Children.Count, (seed, x) => seed ^ x.GetHashCode());19 }
看着还不错,不过由于T实际是个复杂类型,每次重写Equals也是个不轻松的事情,而且还要把整个期望的树给构造出来,呵呵,还是烦啊。。。
但是,如果只需要判定个把简单属性,事情就方便了许多,所以,TreeNode需要一个方法来转换T的类型:
1 public TreeNode<TResult> Select<TResult>(Func<T, TResult> selector)2 {3 return new TreeNode<TResult>(selector(Value), (from c in Children select c.Select(selector)).ToList());4 }
看起来不错,这样就可以有这样的code来玩转tree了:
1 TreeNode<int> intTree = ...2 TreeNode<string> stringTree = intTree.Select(i => i.ToString());
等等,我们可以把这代码写的跟linq:
1 TreeNode<int> intTree = ...2 TreeNode<string> stringTree = from i in intTree3 select i.ToString();
测试代码继续啪啦啪啦的写,唉,测试失败了,什么情况,仔细一看,哦,tree下面节点的顺序错了,而tree的equals方法要求顺序,但是这个测试刚好不要求顺序,于是我有了两个选择:
1. 改写equals方法 (不想折腾集合操作)
2. 让节点排序 (对测试用例而言,构建一个有顺序的树可是很简单的事情)
所以,我需要个OrderBy:
1 public TreeNode<T> OrderBy<TKey>(Func<T, TKey> keySelector)2 {3 return new TreeNode<T>(Value, (from c in Children4 orderby keySelector(c.Value)5 select c.OrderBy(keySelector)).ToList());6 }
这下就可以随便折腾这个树了:
1 TreeNode<int> intTree = ...2 TreeNode<string> stringTree = from i in intTree3 let m = i % 34 order by m5 select i.ToString();
一个简单的Linq to TreeNode
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。