Как я могу заставить свою доходную IEnumerable работать с PagedList - PullRequest
3 голосов
/ 16 февраля 2009

Я использую Постраничный список Троя Гуда в моем проекте.
Обычно вы просто кормите его IEnumerable, startindex и count, и все это работает.
Однако теперь я пытаюсь передать ему 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 () и затем подсчитывать этот список.

Ответы [ 2 ]

4 голосов
/ 16 февраля 2009

1) PagedList будет перебирать ваши данные, по крайней мере, дважды по виду - один раз, чтобы посчитать, а затем один раз, чтобы получить нужную страницу. Убедитесь, что это ничего не испортило - или рассмотрите возможность кэширования в списке или каком-либо другом «дешевом» буфере, чтобы избежать необходимости повторять запрос дважды.

2) Если вы позвоните ToList() по полученному результату, прежде чем передать его в выгружаемый список, будет ли он выглядеть правильно?

3) Если вы просто используете метод GetColors() и выводите все, что оно дает, выглядит ли правильно?

По сути, вам нужно попытаться решить, связана ли проблема с GetColors, PagedList или взаимодействием между ними.

РЕДАКТИРОВАТЬ: Единственный способ "сокращения" Count () заключается в реализации IList или IList<T>. Однако в этот момент вам придется либо сделать это правильно, либо просто переопределить Count и снова внедрить IEnumerable. Я думаю, что звонить по номеру ToList() и использовать результат, скорее всего, будет намного быстрее, если у вас нет большого списка, который вы не хотите хранить в памяти.

0 голосов
/ 16 февраля 2009

Похоже, он примет 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).

...