编程语言
首页 > 编程语言> > 首页> C#>如何使我的产生的IEnumerable工作与PagedList

首页> C#>如何使我的产生的IEnumerable工作与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对象的产量,而不仅仅是分页的.当然,这样做会破坏PagedList的整体使用,并可能导致大量枚举.

– 编辑 –
我想我需要的是一种实现Count()的方法,因此我可以使其从ids.Distinct(int)返回计数,而不是通过ColorService.GetColor()创建所有对象,然后对该列表进行计数.

解决方法:

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

2)如果在将结果传递到分页列表之前在产生的结果上调用ToList(),看起来正确吗?

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

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

编辑:“快捷方式” Count()的唯一方法是实现IList或IList< T>.但是,此时,您要么必须正确执行此操作,要么仅重写Count并再次实现IEnumerable.我认为调用ToList()并使用结果可能会更快,除非您确实有一个不想保留在内存中的庞大列表.

标签:ienumerable,yield,pagedlist,c
来源: https://codeday.me/bug/20191108/2004404.html