我的ordersInfo
变量的类型为IEnumerable<Order>
。 Order
是一个自定义对象。我尝试做出这样的选择:
var s = ordersInfo.Select(x => x.Customer.Email == user.Email && x.Status == OrderStatus.Paid).ToList();
但它返回161个元素的集合(它是集合的初始计数),每个项目的值为false
。它也不是Order
对象。有什么问题?
答案 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()
方法。
根据谓词过滤一系列值。
<强>说明强>
此方法通过使用延迟执行来实现。立即返回值是一个对象,它存储执行操作所需的所有信息。直到通过直接调用其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>
是延迟过滤。