我想知道如何判断我的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);
}
}
(谢谢Tim Schmelter;)
答案 0 :(得分:2)
因为IEnumerable是一个接口,所以你不知道它是如何实现的。即使您编写了枚举代码,并且在这种情况下您还没有,您仍然需要记住,在某些时候您可能会更改基础具体类型(到List,或Collection,或其他)。 ..
出于这个原因,你应该只依赖IEnumerable()本身提供的内容,而且我不相信它确实为你提供了任何有用的东西......所以你有点陷入困境我的观点。
答案 1 :(得分:0)
一种丑陋且容易出错的方式是:
var firstIterFirstItem = accDocumentItems.FirstOrDefault();
var secondIterFirstItem = accDocumentItems.FirstOrDefault();
var isEvaluated = firstIterFirstItem != null && ReferenceEquals(firstIterFirstItem, secondIterFirstItem);
仅适用于可枚举是实现结果的情况(选择等),而不是过滤。
答案 2 :(得分:-1)
您可以尝试使用as
operator:
IList<TSource> list = source as IList<TSource>;
if (list != null)
{
// it is a list or array
}