C# Linq选择列表中存在于(A、B、C)中的对象
我有一个C# Linq选择列表中存在于(A、B、C)中的对象,c#,linq,list,linq-to-objects,exists,C#,Linq,List,Linq To Objects,Exists,我有一个订单列表 我想根据一组订单状态选择订单 因此本质上选择order.StatusCode所在的订单(“A”、“B”、“C”) 您的状态代码也是一个集合,因此请使用: 或在查询语法中: var filteredOrders = from order in orders.Order where allowedStatus.Contains(order.StatusCode) select order; 尝试功
订单列表
我想根据一组订单状态选择
订单
因此本质上选择order.StatusCode所在的订单(“A”、“B”、“C”)
您的状态代码也是一个集合,因此请使用: 或在查询语法中:
var filteredOrders = from order in orders.Order
where allowedStatus.Contains(order.StatusCode)
select order;
尝试功能
确定序列是否包含指定的元素
NB:这是LINQ to对象,我不能100%确定它是否在LINQ to实体中工作,现在没有时间检查它。事实上,在[A,B,C]中将其转换为x并不太困难,但您必须自己检查 因此,您可以使用更简单的任何,而不是包含作为代码中的替换:
// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
where new[] { "A", "B", "C" }.Any(s => s == order.StatusCode)
select order;
这与您从SQL中了解到的相反,这就是为什么它不那么明显的原因
当然,如果您更喜欢流畅的语法,这里是:
var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode));
在这里,我们再次看到LINQ的一个惊喜(比如Joda的演讲将select放在了末尾)。但是,从这个意义上讲,它检查列表(集合、集合)中是否至少有一个项(即any)与单个值匹配是非常合乎逻辑的 请小心,
.Contains()
将匹配任何子字符串,包括您不期望的字符串。例如,new[]{“A”、“B”、“AA”}.Contains(“A”)
将返回您可能不需要的A和AA。我被它咬了
.Any()
或.Exists()
是更安全的选择多亏了所有快速回答。特别适用于lambda解决方案。我还没有对lambda表达式做任何处理。我假设我会使用(o=>!(statuses.contains(o.OrderHeaderOrderStatusCode)))new[]{“B”,“AA”}.contains(“a”)执行一个NOT contains操作。contains(“a”)将返回false,而不是true。我会说,对于allowedStatus,使用HashSet而不是数组,因为HashSet的contains方法最快,并且如果数组包含的项超过1000项,则会出现性能问题。var allowedStatus=新哈希集{“A”、“B”、“C”}@JayShah:迟来的回答:是的,一般来说你是对的,如果你有数千项,那么最好首先使用HashSet
。但这并不是一个好主意:如果您已经传入了一个数组或列表,那么您需要另一个集合,以便获得更多内存。您需要填充该哈希集
,以增加cpu周期。如果不是Linq to Objects,而是Linq to Entities,那么您可能无法使用数千个项目(将包含转换为中的sql-子句,该子句具有。
var statuses = new[] { "A", "B", "C" };
var filteredOrders = from order in orders.Order
where statuses.Contains(order.StatusCode)
select order;
var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
where new[] { "A", "B", "C" }.Any(s => s == order.StatusCode)
select order;
var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode));