1

我想知道如何判断我的IEnumerable<T>是否已作为内存列表加载(即已被评估)?

我希望此检查仅检查 DateTime 的日期部分以进行查询:

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);
    }
}

(谢谢蒂姆·施梅尔特;)

4

3 回答 3

2

因为 IEnumerable 是一个接口,所以您不知道它是如何在后台实现的。即使您编写了枚举代码,而在这种情况下您没有编写,您仍然必须记住,在某些时候您可能会更改底层的具体类型(更改为 List、Collection 或其他)...

出于这个原因,你应该只依赖 IEnumerable() 本身提供的东西,我不相信它确实为你提供了任何有用的东西......所以你在我看来有点卡住了。

于 2013-10-22T13:15:26.120 回答
0

An ugly and error-prone way would be:

var firstIterFirstItem = accDocumentItems.FirstOrDefault();
var secondIterFirstItem = accDocumentItems.FirstOrDefault();

var isEvaluated = firstIterFirstItem != null && ReferenceEquals(firstIterFirstItem, secondIterFirstItem);

Will only work for the case where enumerable is a result of realization(Select, etc.), not filtering.

于 2013-10-22T13:47:25.047 回答
-1

您可以尝试使用as操作员进行投射:

IList<TSource> list = source as IList<TSource>;
if (list != null)
{
    // it is a list or array
}
于 2013-10-22T13:13:55.063 回答