将 lambda 语句写入列表中的 select 项目,其中在枚举值列表中找到项目(枚举)的属性?
Write lambda statement to select items from a list where a property of an item (enum) is found in a list of enum values?
我有一个缓存,用于存储 Project
个对象。项目的一个属性是 ProjectState
,可以是活动、非活动、已取消或已存档。
我想为用户提供 select 给定数量的项目状态的选项,然后提取该列表中具有状态的所有项目。例如,列表可以包含所有四种状态:
List<ProjectState> states = new List<ProjectState>()
{
ProjectState.Active,
ProjectState.Inactive,
ProjectState.Canceled,
ProjectState.Archived
};
不幸的是,我发现自己为每个状态都写了一个条件:
List<Project> myProjects = myCache.Where(p =>
p.state == ProjectState.Active ||
p.state == ProjectState.Inactive ||
p.state == ProjectState.Canceled ||
p.state == ProjectState.Archived).ToList();
有什么方法可以压缩这个语句来检查列表中是否有一个项目?虽然这是无效的语法,但我想要一些可以做的事情:
var myProjects = myCache.Where(p => p.state IN states).ToList();
我找到了解决方案,我会回答这个问题来分享它,因为我确定我不是第一个或最后一个遇到这种情况的人。然而,有更好的解决办法吗?是否有语法检查 'an item is in a list' 而不是 'if a list contains an item'?
绞尽脑汁翻阅文档后,我意识到我的逻辑是错误的。
我太专注于 select 状态在 列表中 的项目,所以我想找到符合该思路的语法。但是,我意识到我可以使用 Contains() 函数,因为它对我来说与 select 列表 包含 该项目状态的项目相同。
我的问题的解决方案是:
var myProjects = myCache.Where(p => states.Contains(p.state)).ToList();
我有一个缓存,用于存储 Project
个对象。项目的一个属性是 ProjectState
,可以是活动、非活动、已取消或已存档。
我想为用户提供 select 给定数量的项目状态的选项,然后提取该列表中具有状态的所有项目。例如,列表可以包含所有四种状态:
List<ProjectState> states = new List<ProjectState>()
{
ProjectState.Active,
ProjectState.Inactive,
ProjectState.Canceled,
ProjectState.Archived
};
不幸的是,我发现自己为每个状态都写了一个条件:
List<Project> myProjects = myCache.Where(p =>
p.state == ProjectState.Active ||
p.state == ProjectState.Inactive ||
p.state == ProjectState.Canceled ||
p.state == ProjectState.Archived).ToList();
有什么方法可以压缩这个语句来检查列表中是否有一个项目?虽然这是无效的语法,但我想要一些可以做的事情:
var myProjects = myCache.Where(p => p.state IN states).ToList();
我找到了解决方案,我会回答这个问题来分享它,因为我确定我不是第一个或最后一个遇到这种情况的人。然而,有更好的解决办法吗?是否有语法检查 'an item is in a list' 而不是 'if a list contains an item'?
绞尽脑汁翻阅文档后,我意识到我的逻辑是错误的。
我太专注于 select 状态在 列表中 的项目,所以我想找到符合该思路的语法。但是,我意识到我可以使用 Contains() 函数,因为它对我来说与 select 列表 包含 该项目状态的项目相同。
我的问题的解决方案是:
var myProjects = myCache.Where(p => states.Contains(p.state)).ToList();