 <p>You need to create a comparer that can compare tuples in such a way that the order of the items doens't matter:</p> <pre><code>public class UnorderedTupleComparer&lt;T&gt; : IEqualityComparer&lt;Tuple&lt;T, T&gt;&gt; { private IEqualityComparer&lt;T&gt; comparer; public UnorderedTupleComparer(IEqualityComparer&lt;T&gt; comparer = null) { this.comparer = comparer ?? EqualityComparer&lt;T&gt;.Default; } public bool Equals(Tuple&lt;T, T&gt; x, Tuple&lt;T, T&gt; y) { return comparer.Equals(x.Item1, y.Item1) &amp;&amp; comparer.Equals(x.Item2, y.Item2) || comparer.Equals(x.Item1, y.Item2) &amp;&amp; comparer.Equals(x.Item1, y.Item2); } public int GetHashCode(Tuple&lt;T, T&gt; obj) { return comparer.GetHashCode(obj.Item1) ^ comparer.GetHashCode(obj.Item2); } } </code></pre> <p>Note that an exclusive or of the hash codes is an operation that is going to have the same result regardless of the order of the operands, making it desirable here (but not in most hash code generating algorithms, as it's usually an <em>undesirable</em> property). As for <code>Equals</code>, one simply needs to check both possible pairings.</p> <p>Once you have that you can do:</p> <pre><code>var query = data.Distinct(new UnorderedTupleComparer&lt;string&gt;()); </code></pre>