C# 高级LINQ滤波

C# 高级LINQ滤波,c#,performance,linq,collections,C#,Performance,Linq,Collections,我对使用LINQ的高级过滤数据有问题 我想获得包含详细信息列表的计划类列表,其中项目列表中的参数包含特定字符。此外,项目列表应仅包含此筛选元素 我的课程如下所示: class Plan { public string Name { get; set; } public List<Detail> Details { get; set; } public Plan() { Details = new List<Detail>(

我对使用LINQ的高级过滤数据有问题


我想获得包含详细信息列表的计划类列表,其中项目列表中的参数包含特定字符。此外,项目列表应仅包含此筛选元素

我的课程如下所示:

class Plan
{
    public string Name { get; set; }
    public List<Detail> Details { get; set; }

    public Plan()
    {
        Details = new List<Detail>();
    }
}

class Detail
{
    public string Setting { get; set; }

    public List<Item> Items { get; set; }

    public Detail()
    {
        Items = new List<Item>();
    }
}

class Item
{
    public string Arguments { get; set; }
}
如何使用WHERE语句编写此代码,或者最好的解决方案是什么


另外,如何使用基于项目列表的LINQ EXPECT获得收获差异?e、 g.计划:包含包含项目的所有计划,计划2:包含包含筛选项目的所有计划,计划3应包含包含不属于计划2的项目的所有计划。

这对您有用吗

首先,我仅将计划限制为其任何详细信息包含与筛选器匹配的任何项的计划

然后,我将每个计划的详细信息限制为仅包含与筛选器匹配的任何项目的计划

然后我限制每个计划的项目

    private List<Plan> FilteredPlans(List<Plan> plans, string filter)
    {
        List<Plan> filteredPlans = plans.Where(plan => plan.Details.Any(detail => detail.Items.Any(item => item.Arguments.Contains(filter)))).ToList();

        foreach (var plan in filteredPlans)
        {
            plan.Details = plan.Details.Where(detail => detail.Items.Any(item => item.Arguments.Contains(filter))).ToList();

            foreach (var detail in plan.Details)
            {
                detail.Items = detail.Items.Where(item => item.Arguments.Contains(filter)).ToList();
            }
        }

        return filteredPlans;
    }
private List filteredplan(列表计划、字符串筛选器)
{
List filteredplan=plans.Where(plan=>plan.Details.Any(detail=>detail.Items.Any(item=>item.Arguments.Contains(filter))).ToList();
foreach(filteredPlans中的var计划)
{
plan.Details=plan.Details.Where(detail=>detail.Items.Any(item=>item.Arguments.Contains(filter)).ToList();
foreach(计划详细信息中的var详细信息)
{
detail.Items=detail.Items.Where(item=>item.Arguments.Contains(filter)).ToList();
}
}
返回筛选计划;
}
另外,这里有另一个版本作为一个单独的语句,但我认为它的可读性要差得多。我基本上是先限制物品,然后再反向工作,只保留不是空的容器

    private List<Plan> FilteredPlansWithSelect(List<Plan> plans, string filter)
    {
        List<Plan> filteredPlans = plans.Select(plan => 
        new Plan()
        {
            Name = plan.Name,
            Details = plan.Details.Select(detail =>
                new Detail()
                {
                    Setting = detail.Setting,
                    Items = detail.Items.Where(item => item.Arguments.Contains(filter)).ToList()
                }).Where(detail => detail.Items.Count > 0).ToList()
        }).Where(plan => plan.Details.Count > 0).ToList();


        return filteredPlans;
    }
private List filteredplan with select(列表计划、字符串筛选器)
{
List filteredPlans=计划。选择(计划=>
新计划()
{
Name=plan.Name,
详细信息=计划。详细信息。选择(详细信息=>
新细节()
{
设置=详细信息。设置,
Items=detail.Items.Where(item=>item.Arguments.Contains(filter)).ToList()
}).Where(detail=>detail.Items.Count>0).ToList()
}).Where(plan=>plan.Details.Count>0).ToList();
返回筛选计划;
}

为Grammar编辑

您能提供一些示例输入和预期输出吗?您的Grammar解决方案似乎总是为您提供全套计划,但如果
参数
不匹配,则
列表项
就是空的。这是期望的结果吗?“带有详细信息列表,其中项目列表中的参数包含特定字符。”这是否意味着如果项目列表不包含特定字符,那么
详细信息
也不应再显示在列表中?是的,这是期望的结果。如果项目不包含特定字符,则项目列表应为空,详细信息列表也应包含这些列表。@MongZhu
计划
过滤计划
的主要区别在于项目列表。
    private List<Plan> FilteredPlansWithSelect(List<Plan> plans, string filter)
    {
        List<Plan> filteredPlans = plans.Select(plan => 
        new Plan()
        {
            Name = plan.Name,
            Details = plan.Details.Select(detail =>
                new Detail()
                {
                    Setting = detail.Setting,
                    Items = detail.Items.Where(item => item.Arguments.Contains(filter)).ToList()
                }).Where(detail => detail.Items.Count > 0).ToList()
        }).Where(plan => plan.Details.Count > 0).ToList();


        return filteredPlans;
    }