 <p>Not saying this is the most efficient way to do it but it works:</p> <pre><code>List&lt;DrawingData&gt; _DrawingList = new List&lt;DrawingData&gt;(); _DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 }); _DrawingList.Add(new DrawingData() { DrawingName = "411000D", DrawingQty = 1 }); _DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 }); _DrawingList.Add(new DrawingData() { DrawingName = "411000A", DrawingQty = 1 }); _DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 }); _DrawingList.Add(new DrawingData() { DrawingName = "411000C", DrawingQty = 1 }); _DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 }); _DrawingList.Add(new DrawingData() { DrawingName = "411000B", DrawingQty = 1 }); var _WithIndex = _DrawingList.Select(x =&gt; new { DrawingData = x, Index = _DrawingList.Where(y =&gt; y.DrawingName == x.DrawingName).ToList().IndexOf(x) }); var _FinalOrder = _WithIndex.OrderBy(x =&gt; x.Index).ThenBy(x =&gt; x.DrawingData.DrawingName).Select(x =&gt; x.DrawingData); Console.WriteLine("Final Sort:"); Console.WriteLine(string.Join("\n", _FinalOrder)); Console.ReadLine(); </code></pre> <p>Get the index of each duplicated item, then sort on that index and then the name.</p> <p>Made it a bit simpler. Can be a single LINQ statement:</p> <pre><code>var _FinalOrder = _DrawingList .Select(x =&gt; new { DrawingData = x, Index = _DrawingList.Where(y =&gt; y.DrawingName == x.DrawingName) .ToList() .IndexOf(x) }) .OrderBy(x =&gt; x.Index) .ThenBy(x =&gt; x.DrawingData.DrawingName) .Select(x =&gt; x.DrawingData); </code></pre>