【发布时间】:2019-05-10 10:40:35
【问题描述】:
我在使用 LINQ 进行高级过滤数据时遇到问题。
我想获取带有详细信息列表的计划类列表,其中项目列表中的参数包含特定字符。此外,Items 列表应仅包含此过滤后的元素。
我的课程如下所示:
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 和Any 编写此代码,但我有计划列表,其中项目包含所有项目。
var filteredPlans = plans.Select(x =>
new Plan
{
Name = x.Name,
Details = x.Details.Select(y =>
new Detail
{
Setting = y.Setting,
Items = y.Items.Where(c => c.Arguments.Contains("...")).Select(z =>
new Item
{
Arguments = z.Arguments
}).ToList()
}).ToList()
});
如何使用 WHERE 语句编写此代码或最好的解决方案是什么?
另外,如何使用基于项目列表的 LINQ EXPECT 获得收获差异?例如计划:包含所有带有项目的计划,计划2:包含所有带有过滤项目的计划,计划3应该包含所有不属于计划2的计划。
【问题讨论】:
-
你能提供一些示例输入和预期输出吗?
-
您的解决方案似乎总是为您提供全套计划,但如果
Arguments不匹配,那么List<Item> Items就是空的。这是期望的结果吗? -
" 带有详细信息列表,其中项目列表中的参数包含特定字符。"这是否意味着如果项目列表不包含特定字符,那么
Detail也不应该再出现在列表中? -
是的,这是理想的结果。如果项目不包含特定字符,则项目列表应为空,并且详细信息列表应包含这些列表。
-
@MongZhu
plans和filteredPlans的主要区别在于项目列表。
标签: c# performance linq collections