如何确定是否已评估 IEnumerable
本文关键字:评估 IEnumerable 是否 何确定 | 更新日期: 2023-09-27 18:36:20
我想知道如何判断我的IEnumerable<T>
是否已作为列表加载到内存中(即已被评估)?
我希望此检查仅用于检查查询的日期时间的日期部分:
private IEnumerable<AccDocumentItem> FilterDocumentItemDateFilter(IEnumerable<AccDocumentItem> accDocumentItems, FilterDocumentDate filterDocumentDate)
{
accDocumentItems =
accDocumentItems.Where(x =>
x.AccDocument.CreateDate >= filterDocumentDate.FromDocumentDate &&
x.AccDocument.CreateDate <= filterDocumentDate.ToDocumentDate);
}
我知道在LinqToEntity
中我们可以使用EntityFunctions.TruncateTime
,显然在LinqToObject
我们可以获取DateTime
的日期部分,但问题是我不知道我的IEnumerable
是否已执行?
编辑:我想这样做:
private IEnumerable<AccDocumentItem> FilterDocumentItemDateFilter(IEnumerable<AccDocumentItem> accDocumentItems, FilterDocumentDate filterDocumentDate)
{
if(accDocumentItems as IList<AccDocumentItem> != null)
{
accDocumentItems =
accDocumentItems.Where(x =>
x.AccDocument.CreateDate.Date >= filterDocumentDate.FromDocumentDate &&
x.AccDocument.CreateDate.Date <= filterDocumentDate.ToDocumentDate);
}
else
{
accDocumentItems =
accDocumentItems.Where(x =>
EntityFunctions.TruncateTime(x.AccDocument.CreateDate) >= filterDocumentDate.FromDocumentDate &&
EntityFunctions.TruncateTime(x.AccDocument.CreateDate) <= filterDocumentDate.ToDocumentDate);
}
}
(谢谢蒂姆·施梅尔特;)
因为 IEnumerable 是一个接口,所以你不知道它是如何在后台实现的。即使您编写了枚举代码,但在本例中您没有编写,您仍然必须记住,在某些时候您可能会更改底层具体类型(列表、集合或其他任何类型)......
出于这个原因,你应该只依赖 IEnumerable() 本身提供的东西,我不相信它确实为你提供了任何有用的东西......所以你有点卡在我的观点中。
一个丑陋且容易出错的方式是:
var firstIterFirstItem = accDocumentItems.FirstOrDefault();
var secondIterFirstItem = accDocumentItems.FirstOrDefault();
var isEvaluated = firstIterFirstItem != null && ReferenceEquals(firstIterFirstItem, secondIterFirstItem);
仅适用于可枚举是实现结果(选择等)的情况,而不是过滤。
您可以尝试使用 as
运算符强制转换它:
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
// it is a list or array
}