将 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();