It looks like you might need something like:
for (int i = 0; i < list.Count - 1; i++) { for (int j = i + 1; j < list.Count; j++) {
You can do this with LINQ:
var pairs = from i in Enumerable.Range(0, list.Count - 1) from j in Enumerable.Range(i + 1, list.Count - i) select Tuple.Create(list[i], list[j]);
I'm not sure this is clearer though ...
EDIT: Another alternative that is less effective but potentially more clear:
var pairs = from i in Enumerable.Range(0, list.Count - 1) let x = list[i] from y in list.Skip(i + 1) select Tuple.Create(x, y);
Jon skeet
source share