我在我的项目中使用Troy Goode's paged List 通常你只需要输入一个IEnumerable,一个startindex和一个项目计数,这一切都有效 然而,现在我正在尝试将它生成一个IEnumerable,我生成如下:
private static IEnumerable<Color> GetColors(Query query)
{
IndexSearcher searcher = new IndexSearcher(luceneIndexpath);
Hits hitColl = searcher.Search(query);
//Get all the unique colorId's
List<int> ids = new List<int>();
int id = 0;
for (int i = 0; i < hitColl.Length(); i++)
{
if (Int32.TryParse(hitColl.Doc(i).GetField("id").StringValue(), out id))
ids.Add(id);
}
foreach (int uniqueId in ids.Distinct<int>())
{
yield return ColorService.GetColor(uniqueId);
}
}
- 编辑 - pagedList可以工作,但是请求所有我的Color对象的yield,而不仅仅是被分页的对象。这种偏离失败了整个PagedList的使用,并可能导致大量的枚举。
- 编辑 -
我认为我需要的是一种实现Count()的方法,所以我可以让它从ids.Distinct(int)返回计数,而不是通过ColorService.GetColor()创建所有对象,然后计算该列表。
答案 0 :(得分:4)
1)PagedList将通过它的外观至少两次遍历您的数据 - 一次计数,然后一次获取正确的页面。确保这不会搞砸 - 或考虑在列表或其他“廉价”缓冲区中缓存,以避免必须两次查询。
2)如果您在将结果列表传递给分页列表之前调用ToList()
,它看起来是否正确?
3)如果您只是使用GetColors()
方法并将其产生的所有内容转储出去, 看起来是否正确?
基本上你需要尝试弄清楚问题是GetColors,PagedList还是两者之间的相互作用。
编辑:“缩短”Count()的唯一方法是实施IList
或IList<T>
。但是,此时您要么必须正确执行此操作,要么 覆盖Count
并再次实施IEnumerable
。我认为调用ToList()
并使用结果可能要快得多,除非你真的有一个你不想留在内存中的大量列表。
答案 1 :(得分:0)
看起来它会接受IQueryable<T>
,因此只需在.AsQueryable()
上致电IEnumerable<T>
即可。但就个人而言,我只是使用.Skip()
和.Take()
来获取页面 - 因此[your enumerable].Skip(20).Take(10)
是基于页面大小为10的第3页。您可以轻松地将其包装到扩展中方法:
public static IEnumerable<T> GetPage<T>(
this IEnumerable<T> source,
int pageIndex, int pageSize)
{
return source.Skip(pageIndex * pageSize).Take(pageSize);
}
然后那将是[your enumerable].GetPage(3, 10)
。