Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq选择列表中存在于(A、B、C)中的对象_C#_Linq_List_Linq To Objects_Exists - Fatal编程技术网

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));