在C#中模拟Python“in”关键字功能的最佳方法?

时间:2013-08-28 22:04:20

标签: c# python linq

环顾四周但却没有看到这个问题。我基本上想知道这样做的“最好”(最快,最可读,最惯用等)的方式。

上下文是我有一个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()。这就是我猜的只是在文本框中键入的内容。

2 个答案:

答案 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状态。如果是,请包含它。如果没有,请将其排除。