Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
905
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Подкачка коллекции с помощью LINQ
Как вы просматриваете коллекцию в LINQ, учитывая, что у вас есть startIndex и count ?
Несколько месяцев назад я написал сообщение в блоге о Fluent Interfaces и LINQ, в котором использовал метод расширения для IQueryable<T> и другого класса, чтобы обеспечить следующий естественный способ разбиения коллекции LINQ на страницы.
var query = from i in ideas
select i;
var pagedCollection = query.InPagesOf(10);
var pageOfIdeas = pagedCollection.Page(2);
Вы можете получить код со страницы MSDN Code Gallery: конвейеры, фильтры, Fluent API и LINQ до SQL .
Я решил эту проблему немного иначе, чем другие, поскольку мне пришлось сделать свой собственный пагинатор с ретранслятором. Поэтому я сначала сделал коллекцию номеров страниц для коллекции предметов, которые у меня есть:
// assumes that the item collection is "myItems"
int pageCount = (myItems.Count + PageSize - 1) / PageSize;
IEnumerable<int> pageRange = Enumerable.Range(1, pageCount);
// pageRange contains [1, 2, ... , pageCount]
Используя это, я мог бы легко разделить коллекцию элементов на коллекцию "pages". Страница в данном случае - это просто набор элементов (IEnumerable<Item>). Вот как вы можете это сделать, используя Skip и Take вместе с выбором индекса из pageRange , созданного выше:
IEnumerable<IEnumerable<Item>> pageRange
.Select((page, index) =>
myItems
.Skip(index*PageSize)
.Take(PageSize));
Конечно, вы должны обрабатывать каждую страницу как дополнительную коллекцию, но, например, если вы вложили повторители, то это на самом деле легко обрабатывать.
Версия one-liner TLDR будет такой:
var pages = Enumerable
.Range(0, pageCount)
.Select((index) => myItems.Skip(index*PageSize).Take(PageSize));
Который можно использовать как этот:
for (Enumerable<Item> page : pages)
{
// handle page
for (Item item : page)
{
// handle item in page
}
}
Этот вопрос несколько устарел, но я хотел опубликовать свой алгоритм подкачки, который показывает всю процедуру (включая взаимодействие с пользователем).
const int pageSize = 10;
const int count = 100;
const int startIndex = 20;
int took = 0;
bool getNextPage;
var page = ideas.Skip(startIndex);
do
{
Console.WriteLine("Page {0}:", (took / pageSize) + 1);
foreach (var idea in page.Take(pageSize))
{
Console.WriteLine(idea);
}
took += pageSize;
if (took < count)
{
Console.WriteLine("Next page (y/n)?");
char answer = Console.ReadLine().FirstOrDefault();
getNextPage = default(char) != answer && 'y' == char.ToLowerInvariant(answer);
if (getNextPage)
{
page = page.Skip(pageSize);
}
}
}
while (getNextPage && took < count);
Однако, если вы стремитесь к производительности, а в производственном коде мы все стремимся к производительности, вы не должны использовать подкачку LINQ, как показано выше, а скорее базовую IEnumerator для реализации подкачки самостоятельно. На самом деле, он так же прост, как и LINQ-алгоритм, показанный выше, но более производителен:
const int pageSize = 10;
const int count = 100;
const int startIndex = 20;
int took = 0;
bool getNextPage = true;
using (var page = ideas.Skip(startIndex).GetEnumerator())
{
do
{
Console.WriteLine("Page {0}:", (took / pageSize) + 1);
int currentPageItemNo = 0;
while (currentPageItemNo++ < pageSize && page.MoveNext())
{
var idea = page.Current;
Console.WriteLine(idea);
}
took += pageSize;
if (took < count)
{
Console.WriteLine("Next page (y/n)?");
char answer = Console.ReadLine().FirstOrDefault();
getNextPage = default(char) != answer && 'y' == char.ToLowerInvariant(answer);
}
}
while (getNextPage && took < count);
}
Пояснение: недостатком использования Skip() для нескольких раз в "cascading manner" является то, что он не будет действительно хранить "pointer" итерации, где он был пропущен в последний раз. - Вместо этого исходная последовательность будет фронтально загружена пропущенными вызовами, что приведет к "consuming" уже "consumed" страницам снова и снова. - Вы можете доказать это сами, когда создадите последовательность ideas так, чтобы она давала побочные эффекты. - >Даже если вы пропустили 10-20 и 20-30 и хотите обработать 40+, вы увидите все побочные эффекты выполнения 10-30 снова, прежде чем начнете повторять 40+.
Вариант, использующий непосредственно интерфейс IEnumerable, вместо этого будет помнить положение конца последней логической страницы, поэтому явный пропуск не требуется и побочные эффекты не будут повторяться.