如何添加到惰性列表
How to add to a lazy list
延迟加载入门。我有一个包含订单详情的订单。
public class Order
{
public Guid OrderId { get; set; } = Guid.NewGuid();
private Lazy<List<OrderDetail>> _OrderDetails => new Lazy<List<OrderDetail>>(() => OrderService.GetOrderDetails(this.OrderId));
public List<OrderDetail> OrderDetails => _OrderDetails.Value;
}
这似乎可以很好地检索订单,但我无法创建订单。在保留新订单之前,我想添加订单详细信息,但是(为简洁起见跳过创建订单详细信息)当涉及到
Order.OrderDetails.Add(orderDetail);
没有向订单添加订单详细信息(没有抛出异常)。我认为这是因为懒惰。如何将成员添加到 OrderDetails 列表?
问题在于 _OrderDetails 中 =>
的使用。这是发生了什么:
如果您调用 Order.OrderDetails.Add(orderDetail)
,这将访问 OrderDetails
属性,后者又会访问 _OrderDetails
属性,后者将执行 new Lazy<List<OrderDetail>>
.这将最终创建列表,您向列表中添加一个新元素。
到目前为止还不错。
但是,如果您随后再次检查 Order.OrderDetails
,这将再次访问 OrderDetails
属性,后者又会访问 _OrderDetails
属性,后者将再做一个 new Lazy<List<OrderDetail>>
。所以你得到一个新的列表(没有你刚刚添加的元素)。
解决方法很简单:更换
private Lazy<List<OrderDetail>> _OrderDetails =>
new Lazy<List<OrderDetail>>(() =>
OrderService.GetOrderDetails(this.OrderId));
来自
private Lazy<List<OrderDetail>> _OrderDetails;
并在构造函数中初始化
public Order()
{
_OrderDetails = new Lazy<List<OrderDetail>>(() =>
OrderService.GetOrderDetails(this.OrderId));
}
这将在第一次访问时仅创建一次列表。
OrderId
真的必须是可写的吗?如果是,您必须在 OrderId
更改时重新创建 _OrderDetails
:
private Guid _orderId = Guid.NewGuid();
public Guid OrderId
{
get { return _orderId; }
set
{
_orderId = value;
// re-create _OrderDetails with the new value of OrderId
_OrderDetails = new Lazy<List<OrderDetail>>(() =>
OrderService.GetOrderDetails(this.OrderId));
}
}
延迟加载入门。我有一个包含订单详情的订单。
public class Order
{
public Guid OrderId { get; set; } = Guid.NewGuid();
private Lazy<List<OrderDetail>> _OrderDetails => new Lazy<List<OrderDetail>>(() => OrderService.GetOrderDetails(this.OrderId));
public List<OrderDetail> OrderDetails => _OrderDetails.Value;
}
这似乎可以很好地检索订单,但我无法创建订单。在保留新订单之前,我想添加订单详细信息,但是(为简洁起见跳过创建订单详细信息)当涉及到
Order.OrderDetails.Add(orderDetail);
没有向订单添加订单详细信息(没有抛出异常)。我认为这是因为懒惰。如何将成员添加到 OrderDetails 列表?
问题在于 _OrderDetails 中 =>
的使用。这是发生了什么:
如果您调用 Order.OrderDetails.Add(orderDetail)
,这将访问 OrderDetails
属性,后者又会访问 _OrderDetails
属性,后者将执行 new Lazy<List<OrderDetail>>
.这将最终创建列表,您向列表中添加一个新元素。
到目前为止还不错。
但是,如果您随后再次检查 Order.OrderDetails
,这将再次访问 OrderDetails
属性,后者又会访问 _OrderDetails
属性,后者将再做一个 new Lazy<List<OrderDetail>>
。所以你得到一个新的列表(没有你刚刚添加的元素)。
解决方法很简单:更换
private Lazy<List<OrderDetail>> _OrderDetails =>
new Lazy<List<OrderDetail>>(() =>
OrderService.GetOrderDetails(this.OrderId));
来自
private Lazy<List<OrderDetail>> _OrderDetails;
并在构造函数中初始化
public Order()
{
_OrderDetails = new Lazy<List<OrderDetail>>(() =>
OrderService.GetOrderDetails(this.OrderId));
}
这将在第一次访问时仅创建一次列表。
OrderId
真的必须是可写的吗?如果是,您必须在 OrderId
更改时重新创建 _OrderDetails
:
private Guid _orderId = Guid.NewGuid();
public Guid OrderId
{
get { return _orderId; }
set
{
_orderId = value;
// re-create _OrderDetails with the new value of OrderId
_OrderDetails = new Lazy<List<OrderDetail>>(() =>
OrderService.GetOrderDetails(this.OrderId));
}
}