如何确定是否已评估 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 是一个接口,所以你不知道它是如何在后台实现的。即使您编写了枚举代码,但在本例中您没有编写,您仍然必须记住,在某些时候您可能会更改底层具体类型(列表、集合或其他任何类型)......

出于这个原因,你应该只依赖 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
}