Оптимизация сортировки списка

149
01 февраля 2018, 15:08

Существует глобальный список новостей

 List<NewsItem> allNews = new List<NewsItem>(); 

Мне нужно взять все эти новости, отсортировать по дате, не трогая глобальный список, и вывести какой-то диапазон, что я и делаю.

 var sortedNews = sortedByDate ? allNews.OrderBy(x => x.CreationDate).ToList() :
     allNews.OrderByDescending(x => x.CreationDate).ToList();
 var articleRange = sortedNews.GetRange(firstIndex, itemsCount);

операция копирования+сортировка занимает слишком много памяти. Можно ли как-то уменьшить размер используемых ресурсов?

Answer 1

Ресурсы выделяются в момент вызова ToList, соответственно нужно убрать лишние вызовы.

Код можно сделать красивее

var articleRange = allNews
    .OrderBy(x => x.CreationDate, !sortedByDate)
    .Skip(firstIndex-1)
    .Take(itemsCount)
    .ToList();

Для этого нужно добавить свой метод расширения

public static class LinqExtensions
{
    public static IOrderedEnumerable<TSource> OrderBy<TSource, TKey>(
        this IEnumerable<TSource> source,
        Func<TSource, TKey> keySelector,
        bool isDesc = false
    )
    {
        return isDesc ? source.OrderByDescending(keySelector) : source.OrderBy(keySelector);
    }
}
Answer 2

Используйте Skip и Take:

 var sortedNews = (sortedByDate ? allNews.OrderBy(x => x.CreationDate) :
     allNews.OrderByDescending(x => x.CreationDate))
     .Skip(firstIndex-1).Take(itemsCount).ToList();
Answer 3

Так ты берешь и создаешь еще одну копию своих данных. Следовательно потребляешь в два раза больше памяти. Обойдись без .ToList(), так у тебя будет только IEnumerable, далее работай с ним. Пройдись циклом по нему и добавляй нужные записи в articleRange. https://msdn.microsoft.com/ru-ru/library/bb534966(v=vs.110).aspx

Либо пробуй использовать LINQ https://metanit.com/sharp/tutorial/15.3.php

READ ALSO
Как можно реализовать вывод ObservableCollection в ходе работы программы WPF C#?

Как можно реализовать вывод ObservableCollection в ходе работы программы WPF C#?

Пытаюсь сделать программу, одной из важных частей которой, будет вывод информации по ходу её работыВ ходе работы программы, необходимые данные...

167
массив записать в csv Nodejs Javascript

массив записать в csv Nodejs Javascript

У меня есть два массива

231
Добавление параметров к onclick атрибуту в javascript

Добавление параметров к onclick атрибуту в javascript

Есть картинка, у неё аттрибут onclick="todo();" Так вот, возможно ли при помощи jquery добавить к onclick аттрибуту определенные параметры, но сделать это...

301
как найти позицию числа в массиве Javascript

как найти позицию числа в массиве Javascript

как найти позицию первого вхождения числа '2' ?

326