Combinations

/// <summary>
///   Returns all combinations of a chosen amount of selected elements in the sequence.
/// </summary>
/// <typeparam name = "T">The type of the elements of the input sequence.</typeparam>
/// <param name = "source">The source for this extension method.</param>
/// <param name = "select">The amount of elements to select for every combination.</param>
/// <param name = "repetition">True when repetition of elements is allowed.</param>
/// <returns>All combinations of a chosen amount of selected elements in the sequence.</returns>
public static IEnumerable<IEnumerable<T>> Combinations<T>( this IEnumerable<T> source, int select, bool repetition = false )
{
	Contract.Requires( source != null );
	Contract.Requires( select >= 0 );

	return select == 0
		? new[] { new T[0] }
		: source.SelectMany( ( element, index ) =>
			source
				.Skip( repetition ? index : index + 1 )
				.Combinations( select - 1, repetition )
				.Select( c => new[] { element }.Concat( c ) ) );
}
Example:
int[] numbers = new[] { 0, 1 };
var result = numbers.Combinations( 2, true );
// result == {{0, 0}, {0, 1}, {1, 0}, {1, 1}}

Description

Returns all combinations of a chosen amount of selected elements in the sequence.

Details

Double click on the code to select all.

 

;