Linq选择列表中的对象IN(A,B,C)

Mar*_*inS 148 c# linq linq-to-objects list exists

我有一份清单orders.
我想orders根据一组订单状态进行选择.

所以基本上 select orders where order.StatusCode in ("A", "B", "C")

// Filter the orders based on the order status
var filteredOrders = from order in orders.Order
                     where order.StatusCode.????????("A", "B", "C")
                     select order;
Run Code Online (Sandbox Code Playgroud)

Tim*_*ter 254

您的状态代码也是一个集合,因此请使用Contains:

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
Run Code Online (Sandbox Code Playgroud)

或者在查询语法中:

var filteredOrders = from order in orders.Order
                     where allowedStatus.Contains(order.StatusCode)
                     select order;
Run Code Online (Sandbox Code Playgroud)

  • 我会说对 allowedStatus 使用 HashSet 而不是数组,因为 HashSet 的 contains 方法是最快的,如果数组包含超过 1000 个项目,则会出现性能问题。var allowedStatus = new HashSet<string> { "A", "B", "C" }; (2认同)

小智 14

var statuses = new[] { "A", "B", "C" };

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;
Run Code Online (Sandbox Code Playgroud)


Son*_*nül 11

试试Contains功能;

确定序列是否包含指定的元素.

var allowedStatus = new[]{ "A", "B", "C" };
var filteredOrders = orders.Order.Where(o => allowedStatus.Contains(o.StatusCode));
Run Code Online (Sandbox Code Playgroud)


Ale*_*tov 11

注意:这是对象的LINQ,我不是100%确定它是否在LINQ中工作,并且没有时间立即检查它.事实上,在[A,B,C]中将其翻译为x并不太难,但你必须亲自检查.

所以,而不是包含作为替代???? 在你的代码中你可以使用任何更LINQ-uish:

// 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;
Run Code Online (Sandbox Code Playgroud)

这与你从SQL中所知的相反,这就是为什么它不那么明显.

当然,如果您更喜欢流利的语法,那么它是:

var filteredOrders = orders.Order.Where(order => new[] {"A", "B", "C"}.Any(s => s == order.StatusCode));
Run Code Online (Sandbox Code Playgroud)

在这里,我们再次看到一个LINQ惊喜(比如Joda-speech,最后选择了).然而,在这个意义上它是非常合乎逻辑的,它检查列表(集合,集合)中的至少一个项目(即任何)是否与单个值匹配.