 <p>If <code>list2</code> is ordered, then simply use your second solution optimized:</p> <pre><code>var exceptIndex = 0; var newList = new List&lt;T&gt;(); for (var i = 0; i &lt; list1.Length; i++) { if (i != list2[exceptIndex]) newList.Add(list1[i]); else exceptIndex++ } return newList; </code></pre>