我有一个包含对象的集合,其中一个对象属性是一个PublishRequestStatus,它是一个枚举值。
我收到了需要匹配的所有枚举值的另一个列表,现在我知道如何搜索匹配值的1个属性:
model = model.Where(x => x.PublishRequestStatus == PublishRequestStatus.Denied);
但是我无法匹配来自其他集合的所有可能值。例如,如果我有一个PublishRequestStatus.Approved
和PublishRequestStatus.Denied
的集合,我如何使用LINQ搜索具有这些枚举值的所有对象?
我发现唯一有效的方法是在循环中为第二个集合中的每个枚举值创建一个列表,最后将所有列表连接在一起。但是,我非常确定LINQ有更好的方法来做我想要实现的目标。
答案 0 :(得分:3)
这可能不是您正在寻找的,但更多的建议。您可以简单地在枚举值上使用按位List<SomeEnum>
,而不是接收|
,并使用Enum.HasFlags
查找它们:
var flags = PublishRequestStatus.Approved | PublishRequestStatus.Denied;
var otherFlags = PublishRequestStatus.Approved |
PublishRequestStatus.Denied |
PublishRequestStatus.MaybeApproved;
Console.WriteLine(otherFlags.HasFlags(flags)); // Yields true.
假设这样的事情是可能的。
答案 1 :(得分:2)
这样的事情:
model = model.Where(x => myEnumList.Contains(x.PublishRequestStatus));
与.Any()
交替使用
model = model.Where(x => myEnumList.Any(y => y == x.PublishRequestStatus));
编辑:根据Yuvals的回答,您也可以简单地检查当前元素x
是否有任何标志:
model = model.Where(x => x.PublishRequestStatus.HasFlags(otherFlags));
这假设你的枚举看起来与此相似:
[Flags]
enum MyEnum { ... }
允许按位|
。
答案 2 :(得分:1)
从性能的角度来看,最好的是避免引入闭包的lambda。所以,如果你有
ICollection<PublishRequestStatus> filter = ...;
其中filter
可以是List<PublishRequestStatus>
,PublishRequestStatus[]
或更好HashSet<PublishRequestStatus>
。
然后您可以使用method group
谓词:
model = model.Where(filter.Contains);