 <p>Well you could certainly remove the <code>ToList</code> call - that's not helping you at all.</p> <p>You could make the calling code simpler like this:</p> <pre><code>var dictionary = allDays.Where(n =&gt; n.Value.IsRequested || n.Value.IsApproved) .ToDictionary(x =&gt; x.Key, x =&gt; x.Value); var mostDays = new SortedList&lt;DateTime, CalendarDay&gt;(dictionary); </code></pre> <p>... but that's going to build an intermediate <code>Dictionary&lt;,&gt;</code>, so it's hardly efficient.</p> <p>Another option is that you could write your own <code>ToSortedList</code> extension method, e.g.</p> <pre><code>public static SortedList&lt;TKey, TValue&gt; ToSortedList&lt;TSource, TKey, TValue&gt; (this IEnumerable&lt;TSource&gt; source, Func&lt;TSource, TKey&gt; keySelector, Func&lt;TSource, TValue&gt; valueSelector) { // TODO: Argument validation var ret = new SortedList&lt;TKey, TValue&gt;(); foreach (var element in source) { ret.Add(keySelector(element), valueSelector(element)); } return ret; } </code></pre> <p>Then the calling code will just be:</p> <pre><code>var mostDays = allDays.Where(n =&gt; n.Value.IsRequested || n.Value.IsApproved) .ToSortedList(x =&gt; x.Key, x =&gt; x.Value); </code></pre> <p>I suspect this should be reasonably efficient, as it will always be adding values to the <em>end</em> of the list during construction.</p> <p>(For a complete job you'd want to add overloads accepting custom key comparers etc... see <code>ToDictionary</code>.)</p>