![](/img/trans.png)
[英]How do I select a subset of items from an anonymous type IEnumerable?
[英]How to select items from IEnumerable?
我的ordersInfo
变量的类型为IEnumerable<Order>
。 Order
是一个自定义对象。 我尝试这样选择:
var s = ordersInfo.Select(x => x.Customer.Email == user.Email && x.Status == OrderStatus.Paid).ToList();
但是它将返回161个元素的集合(这是集合的初始计数),并且每个项目的值都为false
。 它也不是Order
对象。 怎么了?
听起来您想要的是Where语句,而不是Select语句。 选择用于将一个对象转换为另一个对象,或仅选择给定对象的特定部分。 用于过滤的位置。
var s = ordersInfo.Where(x => x.Customer.Email == user.Email
&& x.Status == OrderStatus.Paid).ToList();
我认为您正在寻找“位置Where
而不是“ Select
。
var s = ordersInfo
.Where(x => x.Customer.Email == user.Email &&
x.Status == OrderStatus.Paid)
.ToList();
Select
是每个项目的投影或转换。 像SQL的SELECT
子句一样思考-它更改输出。 您要使用“ Where
(延迟过滤)。
将序列的每个元素投影为新形式。
备注
通过使用延迟执行来实现此方法。 立即返回值是一个对象,该对象存储执行操作所需的所有信息。 直到通过直接调用对象的GetEnumerator方法或在Visual C#中使用foreach或在Visual Basic中使用For Each枚举该对象,才会执行此方法表示的查询。 这种投影方法需要转换函数选择器为源序列source中的每个值生成一个值。 如果选择器返回的值本身就是一个集合,则由使用者自行遍历子序列。 在这种情况下,最好让查询返回单个合并的值序列。 为此,请使用SelectMany方法而不是Select。 尽管SelectMany的工作方式与Select相似,但不同之处在于,转换函数返回一个集合,然后由SelectMany对其进行扩展,然后再返回它。
在查询表达式语法中,select(Visual C#)或Select(Visual Basic)子句转换为Select的调用。
IEnumerable<int> squares = Enumerable.Range(1, 10).Select(x => x * x);
squares.ToList().ForEach(num => Console.WriteLine(num));
输出将是:
1
4
9
16
25
36
49
64
81
100
您也可以使用IEnumerable.Select来仅从对象中选择较少的属性,这将导致创建匿名类型 。
您要使用的是IEnumerable.Where()
方法。
根据谓词过滤值序列。
备注
通过使用延迟执行来实现此方法。 立即返回值是一个对象,该对象存储执行操作所需的所有信息。 直到通过直接调用对象的GetEnumerator方法或在Visual C#中使用foreach或在Visual Basic中使用For Each枚举该对象,才会执行此方法表示的查询。
在查询表达式语法中,where(Visual C#)或Where(Visual Basic)子句转换为对
Where<TSource>(IEnumerable<TSource>, Func<TSource, Boolean>)
的调用。
回答你的问题
像这样使用Where方法。
var s = ordersInfo.Where(x => x.Customer.Email == user.Email
&& x.Status == OrderStatus.Paid)
.ToList();
它实际上将根据作为谓词给出的标准来过滤列表,并且列表应在调用ToList()
方法后进行过滤,因为Where<T>
是延迟过滤。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.