B. *_*non 2 linq ienumerable select tolist take
我正在查看一些LINQ示例,因此提醒他们应该在最后有一个"select"子句.
但我有一个LINQ工作,没有"选择":
public IEnumerable<InventoryItem> Get(string ID, int packSize, int CountToFetch)
{
return inventoryItems
.Where(i => (i.Id.CompareTo(ID) == 0 && i.PackSize > packSize) || i.Id.CompareTo(ID) > 0)
.OrderBy(i => i.Id)
.ThenBy(i => i.PackSize)
.Take(CountToFetch)
.ToList();
}
Run Code Online (Sandbox Code Playgroud)
这是因为:
(a) select is not really necessary?
(b) Take() is doing the "select"
(c) ToList() is doing the "select"
Run Code Online (Sandbox Code Playgroud)
说实话,这是在我添加"ToList()"之前的工作......所以看起来LINQ在允许一个人逃脱的方面是非常宽容/宽松的.
另外,在我正在使用的LINQ中,我认为OrderBy和ThenBy是冗余的,因为用于填充inventoryItems的SQL查询已经具有ORDER BY ID,PackSize子句.我是对的(.OrderBy()和.ThenBy()是不必要的)?
Linq语句确实需要一个select
子句(或其他条款,如a group by
).但是,你没有使用Linq语法,你正在使用Linq Enumerable
扩展方法,这些方法都是(大部分)返回的IEnumerable<T>
.因此,他们不需要Select
操作员.
var result = from item in source
where item.Value > 5
select item;
Run Code Online (Sandbox Code Playgroud)
完全一样
var result = source.Where(item => item.Value > 5);
Run Code Online (Sandbox Code Playgroud)
为了完整性:
var result = from item in source
where item.Value > 5
select item.Value;
Run Code Online (Sandbox Code Playgroud)
完全一样
var result = source.Where(item => item.Value > 5)
.Select(item => item.Value);
Run Code Online (Sandbox Code Playgroud)
Linq语句(Linq语法语句)最后需要一个特殊的子句来表示查询的结果应该是什么.如果没有select
,group by
或其他选择条款,语法是不完整的,并且编译器不知道如何改变表达到适当的扩展方法(这是Linq的语法实际上被编译到).
到目前为止ToList
,这是一个不返回的Enumerable
扩展方法,而是一个.当您使用或将被立即列举并转换为一个列表或数组.如果您的查询很复杂并且您需要多次枚举结果而不多次运行查询,这将非常有用.IEnumerable<t>
List<T>
ToList
ToArray
Enumerable