# 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

- Author:
**Steven Jeuris** - Submitted on:
**11/15/2011 9:28:20 AM** - Language:
**C#** - Type:
**System.IEnumerable<T>** - Views:
**4442**

Double click on the code to select all.