 <p>This returns the sequence you look for:</p> <pre><code>var result = MyList .Select(s =&gt; s.Split('-').OrderBy(s1 =&gt; s1)) .Select(a =&gt; string.Join("-", a.ToArray())) .Distinct(); foreach (var str in result) { Console.WriteLine(str); } </code></pre> <p>In short: split each string on the <code>-</code> character into two-element arrays. Sort each array, and join them back together. Then you can simply use <code>Distinct</code> to get the unique values.</p> <p>Update: when thinking a bit more, I realized that you can easily remove one of the <code>Select</code> calls:</p> <pre><code>var result = MyList .Select(s =&gt; string.Join("-", s.Split('-').OrderBy(s1 =&gt; s1).ToArray())) .Distinct(); </code></pre> <p>Disclaimer: this solution will always keep the value "A-B" over "B-A", regardless of the order in which the appear in the original sequence.</p>