2012-02-27 5 views
1

У меня есть ListView, связанный со списком. Listview реализует пользовательский пейджинг, где возвращается только количество результатов на странице, что отлично работает, когда результаты находятся в алфавитном порядке. Тем не менее, я хотел бы попытаться вернуть результаты в случайном порядке - сценарий - это офис продаж с отображением членов команды в списке..Net - Пользовательский пейджинг со случайным сортировкой

Я ищу, чтобы найти алгоритм, который позволит пользовательский пейджинг, но сохранить рандомизацию по результатам. Например, в алфавитном порядке это просто - .Take (Страница # * ResultsOnPage). Однако, если он рандомизирован каждый раз, когда страница загружается, сценарий, где отдельные лица могут отображаться на нескольких страницах, а некоторые не показаны вообще.

Так цель:

  • Randomize Список
  • Возьмите результаты для данной страницы из списка
  • Получить по мере необходимости на следующей странице того же рандомизированного списка.

Возможно ли это, или мне нужно иметь логически поддерживаемый заказ для успешного выполнения пользовательского поискового вызова?

ответ

1

Возможно, вопрос в том, что это лучший способ сделать это.

Я думаю, вы должны рандомизировать свой список, и пусть все остальное будет работать как обычно. Если это невозможно, вы должны поместить Randomizer (мой термин, не смотрите вверх ...) перед списком. Что-то вроде этого:

class Randomizer<T> : IList<T> 
{ 
    private IList<T> _underlyingList; 
    private List<int> _permutation; 

    public Randomizer(IList<t> underlying) 
    { 
     _underlyingList = underlying; 
     _permutation = GenerateRandomPermutation(_underlyingList.Count); 
    } 

    // Implement the IList interface, for example 
    public T this[int index] { get { return _underlyingList[_permutation[value]]; } } 
} 

Возможно, вы захотите реализовать ICollection, потому что это может сэкономить вам какое-то усилие.

В любом случае, подключите ListView к Randomizer вместо списка, и пусть все остальное останется прежним.

1

Проще всего было бы:

  • Перемешайте весь набор данных.
  • Затем разделите его на страницы, вы можете увидеть here способ разбить список на список меньшего списка.

Вам нужен способ избавиться от списка, если он больше не нужен.

2

Расширение на ответ zmbq, вам не нужно создавать класс, вы можете просто заполнить новый список рандомизированными значениями. Ниже приведено значение this post.

Random rnd = new Random(); 
var randomizedList = from item in list 
        orderby rnd.Next() 
        select item; 
+1

Хмммм, да, это проще, чем мое предложение. Мое предложение лучше, только если T - тип значения, а T изменены во время работы приложения.Что ж, мое предложение имеет в нем слово «перестановка», так что лучше в * этом * аспекте :-) – zmbq

+0

@zmbq: Хорошая точка в типах значений, не подумала об этом. – Guvante

+0

Я думаю, что шансы на это в случае OP очень низкие. – zmbq

2

На самом деле, нет такой вещи, как «Случайный» с компьютером.

Функция Random возвращает ту же серию значений, если вы высеваете ее с тем же начальным значением. Вот почему случайное число часто посеяно в текущее время. Если вы сохраните начальное значение в состоянии просмотра, вы сможете снова и снова обновлять один и тот же список. Если вы хотите создать новый случайный порядок, просто заново создайте семя.

Смежные вопросы