2009-02-16 22 views
3

我在我的項目中使用Troy Goode's paged List
通常你只需要給它一個IEnumerable,一個startindex和一個項目計數,它都可以工作。
但是現在我想如下給它一個IEnumerable我產生:我如何使我的IEnumerable與PagedList工作

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工作,但要求我所有的物體色彩的產量,而不是隻分頁的。這個偏離路線失敗了PagedList的整個使用,並可能導致大量的枚舉。

- 編輯 -
我想我需要的是實現計數()的方式,所以我可以把它從ids.Distinct(INT),而不是通過ColorService創建的所有對象返回計數。 GetColor()然後計算該列表。

回答

0

它看起來像它會接受IQueryable<T>,所以只需撥打.AsQueryable()在您的IEnumerable<T>它應該工作。就個人而言,雖然,我只是用.Skip().Take()讓頁面 - 所以[your enumerable].Skip(20).Take(10)是第3頁基於對10頁大小可以很容易地把這個包成一個擴展方法:

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)

+0

它已經使用IEnumerable並在必要時調用AsQueryable。 – 2009-02-16 11:45:59

+0

d'oh!從頭開始,然後... – 2009-02-16 11:52:29

4

1)PagedList將通過它的外觀至少遍歷數據兩次 - 一次來計算它,然後一次獲取正確的頁面。確保這不會讓事情搞砸 - 或考慮緩存在列表或其他「便宜」緩衝區中,以避免查詢兩次。

2)如果您在將您的結果傳遞給分頁列表之前調用ToList(),它看起來是否正確?

3)如果你只是使用你的GetColors()方法並將所有產品轉儲出去,看起來是否正確?

基本上你需要嘗試解決問題是與GetColors,PagedList還是兩者之間的交互。

編輯:「短切」Count()的唯一方法是執行IListIList<T>。但是,此時您必須正確執行此操作,否則只需覆蓋Count並再次執行IEnumerable。我想調用ToList(),並且使用結果可能會更快,除非您真的擁有一個不想保留在內存中的大量列表。

相關問題