繁体   English   中英

如何从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 (延迟过滤)。

从MSDN-IEnumerable.Select

将序列的每个元素投影为新形式。

备注

通过使用延迟执行来实现此方法。 立即返回值是一个对象,该对象存储执行操作所需的所有信息。 直到通过直接调用对象的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()方法。

从MSDN-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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM