Ну, конечно, вы можете удалить звонок ToList
- это вам совсем не поможет.
Вы можете сделать вызывающий код проще, как это:
var dictionary = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved)
.ToDictionary(x => x.Key, x => x.Value);
var mostDays = new SortedList<DateTime, CalendarDay>(dictionary);
... но это будет промежуточное звено Dictionary<,>
, так что оно вряд ли будет эффективным.
Другой вариант заключается в том, что вы можете написать свой собственный метод расширения ToSortedList
, например
public static SortedList<TKey, TValue> ToSortedList<TSource, TKey, TValue>
(this IEnumerable<TSource> source,
Func<TSource, TKey> keySelector,
Func<TSource, TValue> valueSelector)
{
// TODO: Argument validation
var ret = new SortedList<TKey, TValue>();
foreach (var element in source)
{
ret.Add(keySelector(element), valueSelector(element));
}
return ret;
}
Тогда код вызова будет просто:
var mostDays = allDays.Where(n => n.Value.IsRequested || n.Value.IsApproved)
.ToSortedList(x => x.Key, x => x.Value);
Я подозреваю, что это должно быть достаточно эффективно, так как оно всегда будет добавлять значения в конец списка 1018 * во время построения.
(Для полной работы вы хотели бы добавить перегрузки, принимающие пользовательские сравнения ключей и т. Д., См. ToDictionary
.)