Partitioning a sequence into sublists
Just a small point to start:

new List&lt;T&gt;(new[] { itr.Current });


You don't need the array too, you can just do:

new List&lt;T&gt; { itr.Current };


I'd suggest that you aim for consistency with your generic type names too. Why X vs PK? I'd suggest TKey for both.

You could do it just with a foreach:

public static IEnumerable&lt;IEnumerable&lt;T&gt;&gt; Partition&lt;T, TKey&gt;(
    this IEnumerable&lt;T&gt; items, 
    Func&lt;T, TKey&gt; keySelector, 
    IEqualityComparer&lt;TKey&gt; comparer)
{
    List&lt;T&gt; currentPartition = null;
    foreach (var item in items)
    {
        if (currentPartition != null 
            &amp;&amp; comparer.Equals(keySelector(item), keySelector(currentPartition[0])))
        {
            currentPartition.Add(item);
        }
        else 
        {
            if (currentPartition != null)
            {
                yield return currentPartition;
            }
            currentPartition = new List&lt;T&gt; { item };
        }
    }
    if (currentPartition != null)
    {
        yield return currentPartition;
    }
}


Is it clearer than your code? I'm not convinced it is.