Linq = language integrated query
Random random = ... ; int block = ... ;
IEnumerable<Pair<V,G>> store =
from Pair<V,G> p in this.pool
group p by p.first into g
orderby g.Key
from q in g.Distinct()
.OrderBy(p => random.Next())
.Take(block)
select q;
this.pool = store.Take(this.size).ToList();