环顾四周但却没有看到这个问题。我基本上想知道这样做的“最好”(最快,最可读,最惯用等)的方式。
上下文是我有一个LINQ查询来根据可能的枚举值列表进行过滤,并希望将其保持为尽可能不嵌套。在python中,它就像
def GetItems(status_types:list)
return filter(lambda item: item.Status in status_types, ALL_ITEMS)
我认为在C#中我可能需要做一个
ALL_ITEMS
.Where(i => Enum.GetValues(typeof(StatusEnum)
.Intersect(status_types))
.Contains(i.Status));
这合理吗?这对我来说似乎有点迟钝,尽管它可能只是我自己的个人迟钝发挥作用。
编辑我想我在这里使用了Any()错误。现在正在寻找合适的linq thingo,抱歉。更改为包含,并添加了typeof()。这就是我猜的只是在文本框中键入的内容。
答案 0 :(得分:2)
我不确定为什么你使用Intersect
过度合成事物,因为你只对{i} status_types
包含i.Status
的findinf感兴趣,而不是在它们的集合交集中。
无论如何,这两个都应该完成这项工作,即使第一种形式看起来更简单(我提到第二种,因为你提到使用了Any):
ALL_ITEMS
.Where(i => status_types.Contains(i.Status));
或
ALL_ITEMS
.Where(i => status_types.Any(x=>x==i.Status));
答案 1 :(得分:1)
var itemsWithCorrectStatus = collection.Where(i=>status_types.Contains(i.Status));
迭代集合中的每个项目,并检查i.Status是否处于status_types状态。如果是,请包含它。如果没有,请将其排除。