gpt4 book ai didi

c# - LINQ,第三个嵌套子项的属性值等于什么?

转载 作者:太空狗 更新时间:2023-10-29 23:31:28 24 4
gpt4 key购买 nike

我无法让这个 LINQ 返回任何结果,我有几个这样的类:

public class RestaurantMenu
{
public List<MenuItem> MenuItems { get; set; }
}

public class MenuItem
{
public decimal Price { get; set; }
public List<FoodItem> FoodItems { get; set; }
}

public class FoodItem
{
public string Label { get; set; }
}

给定 RestaurantMenu 列表,我试图返回任何匹配结果,其中餐厅菜单的菜单项的食品项标签与列表中的所有字符串匹配。基本上,你输入你想吃的食物,它应该返回所有你想吃的东西的餐馆。它应该支持多个字符串,但我什至无法匹配一个字符串。

假设如下:

List<RestaurantMenu> allRestaurantMenus = /blah;
List<string> labelOfFoodsDesired = /blah;

我尝试通过链接 where 表达式来做到这一点:

IQueryable<RestaurantMenu> query = allRestaurantMenus.AsQueryable();

foreach (string foodItem in labelOfFoodItemsDesired)
{
query = query.Where(x => x.MenuItems.Any(y => y.FoodItems.Select(z => z.Label).Contains(foodItem)));
}

List<RestaurantMenu> matchingRestaurantMenus = query.ToList();

但它始终不返回任何结果,即使通过调试我确定存在匹配项。我将如何编写此查询?

最佳答案

allRestaurantMenus.Where(m => 
m.MenuItems.Any(mi =>
!labelOfFoodsDesired.Except(mi.FoodItems.Select(fi => fi.Label)).Any()))

工作原理:我们正在过滤至少有一个菜单项包含您传递的所有标签的菜单。用Enumerable.Except

!labelOfFoodsDesired.Except(mi.FoodItems.Select(fi => fi.Label)).Any()

我们在所需标签和食品的所有标签之间产生设定差异。如果所有需要的标签都存在于食品标签中,则 set 将为空。

更新:如果您应该检查任何菜单项(不是单个菜单项),那么查询将如下所示

allRestaurantMenus.Where(m => 
!labelOfFoodsDesired.Except(
m.MenuItems.SelectMany(mi => mi.FoodItems.Select(fi => fi.Label))).Any())

工作原理:方法与上述相同,但您应该检查所有菜单项的所有标签。这是用 Enumerable.SelectMany 完成的它将菜单项的集合展平为所有标签的集合。然后,如上所述,您可以在所需标签和所有菜单项的所有标签之间建立集合差异。如果设置为空,则菜单满足您的条件。

测试:给定以下菜单

List<RestaurantMenu> allRestaurantMenus = new List<RestaurantMenu> {
new RestaurantMenu {
MenuItems = new List<MenuItem> {
new MenuItem {
FoodItems = new List<FoodItem> {
new FoodItem { Label = "Chocolate" },
new FoodItem { Label = "Water" }
}
},
new MenuItem {
FoodItems = new List<FoodItem> {
new FoodItem { Label = "Egg" },
new FoodItem { Label = "Ketchup" }
}
}
}
},
new RestaurantMenu {
MenuItems = new List<MenuItem> {
new MenuItem {
FoodItems = new List<FoodItem> {
new FoodItem { Label = "Water" }
}
},
new MenuItem {
FoodItems = new List<FoodItem> {
new FoodItem { Label = "Banana" },
new FoodItem { Label = "Peach" }
}
}
}
}
};

并遵循所需的标签

List<string> labelOfFoodsDesired = new List<string>
{
"Water", "Banana"
};

上面的查询会将菜单展平为所有标签的序列:

{ "Chocolate", "Water", "Egg", "Ketchup" }
{ "Water", "Banana", "Peach" }

然后它将在所需标签和扁平化结果之间建立集合差异:

{ "Banana" }
{ }

因此第二个结果为空(菜单中存在所有需要的标签),只有第二个菜单匹配。

关于c# - LINQ,第三个嵌套子项的属性值等于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21356594/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com