如何使我的IEnumerable与PagedList一起工作

时间:2009-02-16 11:38:00

标签: c# ienumerable yield pagedlist

我在我的项目中使用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()创建所有对象,然后计算该列表。

2 个答案:

答案 0 :(得分:4)

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

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

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

基本上你需要尝试弄清楚问题是GetColors,PagedList还是两者之间的相互作用。

编辑:“缩短”Count()的唯一方法是实施IListIList<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)