C# 如何使用Linq筛选具有子列表的项列表以删除C中不允许的项?
我有一个两层列表对象,我正在尝试将所需数据选择到另一个列表中。请参考以下型号和样本数据 在本例中,我只想从列表中选择user_access==true,但无法正确获取它。选项部分中的数据不会被过滤。 我所尝试的C# 如何使用Linq筛选具有子列表的项列表以删除C中不允许的项?,c#,list,linq,C#,List,Linq,我有一个两层列表对象,我正在尝试将所需数据选择到另一个列表中。请参考以下型号和样本数据 在本例中,我只想从列表中选择user_access==true,但无法正确获取它。选项部分中的数据不会被过滤。 我所尝试的 menudata = menusetup.Where(e => e.user_access == true) .Where(e => e.Options.Any(s => s.user_access == true)).ToLis
menudata = menusetup.Where(e => e.user_access == true)
.Where(e => e.Options.Any(s => s.user_access == true)).ToList();
请给我一些建议
谢谢
private class MenuModel
{
public string Id { get; set; } // menu type
public List<MenuModel> Options { get; set; }
public string Value { get; set; }
public string imgUrl { get; set; }
public string Count { get; set; }
public string About { get; set; }
public bool user_access { get; set; } = false;
public bool vendor_access { get; set; } = false;
}
要求:从menuSetup序列中查询所有具有真正UserAccess的MenuModel,每个MenuModel及其具有真正UserAccess的选项
var result = menuSetups.Where(menuSetup => menuSetup.UserAccess)
.Select(menuSetup => new
{
Id = menuSetup.Id,
Value = menuSetup.Value,
UserAccess = true, // do you really need this? you already know that it's true
Options = menuSetup.Options
.Where(option => option.UserAccess)
.Select(option = > new
{
Id = option.Id,
Value = option.Value,
UserAccess = true,
})
.ToList(),
});
换句话说:从menuSetups序列中,仅保留那些具有真实值的menuSetups供UserAccess使用。从每个剩余的菜单集获取属性
仅保留每个剩余菜单设置程序中对UserAccess具有真实值的选项。并选择属性
几点建议
如果只选择实际计划使用的属性,则效率更高。不要选择外键,也不要选择您已经知道其值的其他值
不要使用UserAccess==true。它给人的印象是你不懂布尔语。这种编码风格导致:
if (a == true)
b = true;
else
b = false;
而不是:
b = a;
为什么还有第二个。其中,我会尝试剪切它,看看它是否只适用于第一个。您当前的查询将从menusetup返回所有都为1的项。满足用户_访问==true和2。在选项中至少有一个选项是user_access==trueOlivier,该选项不起作用。它也不会过滤用户访问的选项。嗨,奥利弗,我已经在我的问题正文中添加了预期的输出。至于theID,请忽略它。它用于标识它是否为菜单组。Thnks@WilsonTeo像性别、种类、类别或类似的名字比Id更合适吗?
if (a == true)
b = true;
else
b = false;
b = a;