3

我在我的项目中使用了Troy Goode 的分页列表
通常你只需给它一个 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);
    }
}

--EDIT-- pagedList 有效,但请求我的所有 Color 对象的收益,而不仅仅是分页的对象。这当然会破坏 PagedList 的整个使用,并可能导致大量枚举。

--EDIT--
我认为我需要的是一种实现 Count() 的方法,这样我就可以让它从 ids.Distinct(int) 返回计数,而不是通过 ColorService.GetColor() 创建所有对象,然后计算该列表.

4

2 回答 2

4

1) PagedList 将至少通过它的外观遍历您的数据两次 - 一次计算它,然后一次获取正确的页面。确保这不会搞砸 - 或考虑缓存在列表或其他一些“便宜”缓冲区中以避免必须查询两次。

2)如果您ToList()在将结果传递给分页列表之前调用它,它看起来是否正确?

3)如果您只是使用您的GetColors()方法并转储它产生的所有内容,看起来正确吗?

基本上,您需要尝试确定问题出在 GetColors、PagedList 还是两者之间的交互上。

编辑:“捷径” Count() 的唯一方法是实现IListor IList<T>。但是,此时您要么必须正确执行此操作,要么只需覆盖CountIEnumerable再次实施。我认为调用ToList()和使用结果可能会快很多,除非你真的有一个不想保存在内存中的大量列表。

于 2009-02-16T11:45:08.270 回答
0

看起来它会接受IQueryable<T>,所以只要打电话.AsQueryable()给你IEnumerable<T>,它应该可以工作。不过,就我个人而言,我只是使用.Skip()and.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)

于 2009-02-16T11:41:35.330 回答