如何从IEnumerable中选择项目?

时间:2014-08-26 16:10:08

标签: c# linq

我的ordersInfo变量的类型为IEnumerable<Order>Order是一个自定义对象。我尝试做出这样的选择:

var s = ordersInfo.Select(x => x.Customer.Email == user.Email && x.Status == OrderStatus.Paid).ToList();

但它返回161个元素的集合(它是集合的初始计数),每个项目的值为false。它也不是Order对象。有什么问题?

4 个答案:

答案 0 :(得分:4)

我认为您正在寻找Where而不是Select

var s = ordersInfo
   .Where(x => x.Customer.Email == user.Email && 
               x.Status == OrderStatus.Paid)
   .ToList();

答案 1 :(得分:4)

听起来你想要Where语句,而不是Select语句。 Select用于将一个对象转换为另一个对象,或仅选择给定对象的特定部分。用于过滤的地方。

var s = ordersInfo.Where(x => x.Customer.Email == user.Email 
  && x.Status == OrderStatus.Paid).ToList();

答案 2 :(得分:3)

Select是每个项目的投影或转化。像SQL的SELECT子句一样思考 - 它会改变输出。您想使用Where这是一种延迟过滤。

答案 3 :(得分:1)

From MSDN - IEnumerable.Select

  

将序列的每个元素投影到新表单中。

     

<强>说明

     

此方法通过使用延迟执行来实现。立即返回值是一个对象,它存储执行操作所需的所有信息。在通过直接调用其GetEnumerator方法或在Visual C#中使用foreach或在Visual Basic中使用For Each来枚举对象之前,不会执行此方法表示的查询。   此投影方法需要变换函数selector,为源序列source中的每个值生成一个值。如果selector返回一个本身就是集合的值,则由消费者手动遍历子序列。在这种情况下,查询返回单个合并的值序列可能会更好。要实现此目的,请使用SelectMany方法而不是Select。尽管SelectMany的工作方式与Select类似,但它的不同之处在于transform函数返回一个集合,然后在返回之前由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 来仅从对象中选择较少的属性,这将导致创建anonymous type

您想要的是使用IEnumerable.Where()方法。

From 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>是延迟过滤。