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


169

我有一个清单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;

感谢所有这么快回答。用于lambda解决方案的Esp。我还没有对lambda表达式做任何事情。我假设我会使用(o =>!(statuses.Contains(o.OrderHeaderOrderStatusCode)))做一个NOT包含
MartinS 2013年

Answers:


288

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

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

或在查询语法中:

var filteredOrders = from order in orders.Order
                     where allowedStatus.Contains(order.StatusCode)
                     select order;

1
我要说的是,对HallowSet使用HashSet而不是array,因为HashSet的contains方法最快,并且如果数组包含1000多个项目,则会出现性能问题。var allowedStatus = new HashSet <string> {“ A”,“ B”,“ C”};
杰伊·沙

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

var filteredOrders = from order in orders.Order
                             where statuses.Contains(order.StatusCode)
                             select order;

15

注意:这是对象的LINQ,我不确定100%是否可以在LINQ实体中使用,并且现在没有时间检查它。实际上,在[A,B,C]中将其转换为x并不是很困难但是您必须自己检查一下。

因此,而不是用Contains代替???? 在你的代码,你可以使用任何哪个更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;

与您从SQL知道的相反,这就是为什么它并不那么明显的原因。

当然,如果您更喜欢流利的语法,则为:

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

在这里,我们再次看到LINQ的惊喜之一(例如Joda-speech,它把select放在最后)。但是,从这种意义上说,它检查列表(集合,集合)中的至少一项(即any)是否与单个值匹配是很合逻辑的。


12

尝试Contains功能;

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

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

-3

请注意,.Contains()将匹配包括您不期望的字符串在内的任何子字符串。例如。new[] { "A", "B", "AA" }.Contains("A")将同时返回您可能不想要的A和AA。我被它咬了。

.Any()还是.Exists()更安全的选择


new [] {“ B”,“ AA”}。Contains(“ A”)将返回false,而不是true。
杰伊·沙
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.