>如何与System.Lazy< ...>现在可以在.NET 4.0(或许更早)中构建?
基于DoctaJones的更好的深度答案:
>如果我想以IQueryable作为List< T>?来操作,你会推荐一个吗?
我假设自从Lazy< T>在现在的框架下,对未来的支持和可维护性是一个更安全的打击?
>如果我想使用强类型而不是匿名(var)类型,以下语句在功能上是等效的?
> Lazy< List< Products>> Products = new Lazy< List< Product>>();
> LazyList< Product> = new LazyList< Product>();
解决方法
使用示例将是
var myList = new LazyList(products.Where(p => p.Name.StartsWith("T")); //initialization occurs here Console.Write(myList.Count);
System.Lazy<T>类可以使用任何类型,不限于IQueryable< T>.第一次访问Lazy<T>.Value属性时,会发生延迟初始化.
使用示例将是
var lazyString = new Lazy(() => "Hello world"); //initialization occurs here Console.Write(lazyString.Value);
我们可以重写LazyList< T>使用Lazy< T>如下:
var myList = new Lazy(() => products.Where(p => p.Name.StartsWith("T").ToList()); //initialization occurs here Console.Write(myList.Value.Count);
简而言之:LazyList< T>仅适用于IQueryable< T>,Lazy< T>适用于任何类型.
LazyList< T>是针对何时希望IQueryable< T>的结果的具体用例.作为列表< T>,但您不希望评估发生,直到您使用它.
更新回答扩大问题:
Would you recommend one over the other if I wanted to operate on IQueryable as a List<T>?
I’m assuming that since Lazy<T> is in the framework now,it is a safer bet for future support and maintainability?
我个人不会使用.如果你有一个IQueryable我会保持它作为一个IQueryable,以最大限度地发挥你的灵活性.通过保持IQueryable,您仍然可以访问LINQ to sql的查询理解(只要上下文仍然存在).
例如,如果在IQueryable上调用.ToList(),您将要求LINQ to sql从目标表中选择所有列,并将所有结果进行合并(这可能非常昂贵,尤其是如果您有数千个结果).这将被转换为“SELECT * FROM MyTable”.
如果您在IQueryable上调用.Count(),您将要求LINQ to sql获取结果数,这将被转换为“SELECT COUNT(*)FROM MyTable”.这样做比将所有的结果都保湿得更有效率,然后对它们进行计数,特别是如果你只对数字感兴趣的话!
通过使用.Where()在IQueryable LINQ to sql将添加您的条件到SQL查询中的WHERE子句.这意味着您只会从您感兴趣的sql中提取数据,而不是水化您无意使用的结果.
你会看到,通过保持IQueryable,你可以使自己更加灵活.大多数时候它会给你更好的表现,而不是整理结果集.
If I want to use a strong type instead of an anonymous (var) type would the following statements be functionally equivalent?
Lazy<List<Product>> products = new Lazy<List<Product>>(); LazyList<Product> products = new LazyList<Product>();
我认为你的匿名打字与隐含的打字混淆.使用var关键字声明的变量被隐式输入,以匹配分配给它的类型.它是强类型的,因此在初始赋值后不能更改.
这两个语句在功能上并不等同. LazyList< Product>是一种IList<产品>&< Lazy< List< Product>>是包含List< Product>的包装器.因为你有兴趣在一个懒惰的评估列表上运行,所以我会说LazyList可能更具体到你的目的.
你应该问自己,如果你真的需要一个实际的产品清单.如果没有一个令人信服的理由有一个实际的列表我会坚持使用IQueryable.