加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – linq嵌套列表包含

发布时间:2020-12-15 08:40:11 所属栏目:百科 来源:网络整理
导读:我有一个问题,你在那里 linq专家! 在组件实例的嵌套列表中,我需要知道其中是否存在特定类型的组件.可以用linq表达吗?考虑到可能有application.Components [0] .Components [0] .Components [0] …我的问题是面向linq中的递归查询! 我告诉你实体让你对模型
我有一个问题,你在那里 linq专家!
在组件实例的嵌套列表中,我需要知道其中是否存在特定类型的组件.可以用linq表达吗?考虑到可能有application.Components [0] .Components [0] .Components [0] …我的问题是面向linq中的递归查询!

我告诉你实体让你对模型有所了解.

public class Application
{
    public List<Component> Components { get; set; }
}

public class Component
{
    public ComponentType Type { get; set; }
    public List<Component> Components { get; set; }
}

public enum ComponentType
{
    WindowsService,WebApplication,WebService,ComponentGroup
}

解决方法

您想知道组件中的任何组件是否属于给定类型?
var webType = ComponentType.WebApplication;
IEnumerable<Component> webApps = from c in components
                                 from innerComp in c.Components
                                 where innerComp.Type == webType;
bool anyWebApp = webApps.Any();

what about innercomp.components?

编辑:所以你想要不仅在顶层或第二层递归地找到给定类型的组件.然后您可以使用以下Traverse扩展方法:

public static IEnumerable<T> Traverse<T>(this IEnumerable<T> source,Func<T,IEnumerable<T>> fnRecurse)
{
    foreach (T item in source)
    {
        yield return item;

        IEnumerable<T> seqRecurse = fnRecurse(item);
        if (seqRecurse != null)
        {
            foreach (T itemRecurse in Traverse(seqRecurse,fnRecurse))
            {
                yield return itemRecurse;
            }
        }
    }
}

以这种方式使用:

var webType = ComponentType.WebApplication;
IEnumerable<Component> webApps = components.Traverse(c => c.Components)
                                 .Where(c => c.Type == webType);
bool anyWebApp = webApps.Any();

样本数据:

var components = new List<Component>() { 
    new Component(){ Type=ComponentType.WebService,Components=null },new Component(){ Type=ComponentType.WebService,Components=new List<Component>(){
        new Component(){ Type=ComponentType.WebService,new Component(){ Type=ComponentType.ComponentGroup,new Component(){ Type=ComponentType.WindowsService,} },Components=new List<Component>(){
            new Component(){Type=ComponentType.WebApplication,Components=null}
        } },};

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读