如何搜索使用LINQ分层数据 [英] How to search Hierarchical Data with Linq
本文介绍了如何搜索使用LINQ分层数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我需要搜索数据的树,可能是树中的任何地方。这可怎么使用LINQ做?
类节目
{
静态无效的主要(字串[] args){ VAR familyRoot =新的家庭(){名称=FamilyRoot}; VAR familyB =新的家庭(){名称=FamilyB};
familyRoot.Children.Add(familyB); VAR familyC =新的家庭(){名称=FamilyC};
familyB.Children.Add(familyC); VAR familyD =新的家庭(){名称=FamilyD};
familyC.Children.Add(familyD); //可以有从1到n水平的家庭。
//搜索所有的孩子,孙子,曾孙等,对于FamilyD,并返回对象。
}
}公共类家庭{
公共字符串名称{;组; }
清单<家庭> _children =新的List<家庭>(); 公开名单<家庭>儿童{
{返回_children; }
}
}
解决方案
的这是一个扩展 It'sNotALie。
的回答。的
公共静态类的Linq
{
公共静态的IEnumerable< T>拼合< T>(这件T源,Func键< T,IEnumerable的< T>>选择器)
{
返回选择器(源).SelectMany(C =>压扁(C,选择器))
.Concat(新[] {源});
}
}
抽样检测用法:
VAR的结果= familyRoot.Flatten(X => x.Children).FirstOrDefault(X => x.Name ==FamilyD);
返回 familyD
对象。
您可以把它在的IEnumerable&LT工作; T>
源太:
公共静态的IEnumerable< T>拼合< T>(这个IEnumerable的< T>源,Func键< T,IEnumerable的< T>>选择器)
{
返回source.SelectMany(X =>展平(X,选择器))
.Concat(源);
}
I need to search a tree for data that could be anywhere in the tree. How can this be done with linq?
class Program
{
static void Main(string[] args) {
var familyRoot = new Family() {Name = "FamilyRoot"};
var familyB = new Family() {Name = "FamilyB"};
familyRoot.Children.Add(familyB);
var familyC = new Family() {Name = "FamilyC"};
familyB.Children.Add(familyC);
var familyD = new Family() {Name = "FamilyD"};
familyC.Children.Add(familyD);
//There can be from 1 to n levels of families.
//Search all children, grandchildren, great grandchildren etc, for "FamilyD" and return the object.
}
}
public class Family {
public string Name { get; set; }
List<Family> _children = new List<Family>();
public List<Family> Children {
get { return _children; }
}
}
解决方案
That's an extension to It'sNotALie.
s answer.
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 });
}
}
Sample test usage:
var result = familyRoot.Flatten(x => x.Children).FirstOrDefault(x => x.Name == "FamilyD");
Returns familyD
object.
You can make it work on IEnumerable<T>
source too:
public static IEnumerable<T> Flatten<T>(this IEnumerable<T> source, Func<T, IEnumerable<T>> selector)
{
return source.SelectMany(x => Flatten(x, selector))
.Concat(source);
}
这篇关于如何搜索使用LINQ分层数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文