使用C#编译器查询理解功能,您可以编写如下代码:
var names = new string[] { "Dog", "Cat", "Giraffe", "Monkey", "Tortoise" };
var result =
from animalName in names
let nameLength = animalName.Length
where nameLength > 3
orderby nameLength
select animalName;
Run Code Online (Sandbox Code Playgroud)
在上面的查询表达式中,let关键字允许将值传递给where和orderby操作,而无需重复调用animalName.Length.
什么是LINQ扩展方法调用的等效集合,它实现了"let"关键字在这里的作用?
我正在寻找一种按功能对集合进行排序的有效方法,并同时根据该函数的求值对集合进行过滤。为了显示:
var materialsByExpiry = from m in materials
where m.ExpiryDate() >= today
orderby m.ExpiryDate()
select m;
Run Code Online (Sandbox Code Playgroud)
由于materials是一个大集合,并且ExpiryDate是一个非平凡的计算,因此我想最大程度地减少对的调用次数ExpiryDate。显然ExpiryDate,每种材料只需要调用一次,但是此代码将其调用n + q次,其中n是元素总数,q是通过过滤器的数量。
我可以看到一种可能性是定义一个结构,该结构可以存储物料及其有效期并进行处理。但是,有没有更有效的方法(花时间去制定自己的排序/过滤器算法)?