Algoritmo de combinaciones con C#/LINQ

Aunque se trata de un problema sencillo, típicamente estudiado en asignaturas de 1º o 2º como “Introducción a la programación” o “Análisis y Diseño de Algoritmos” me gustaría compartir el código de las combinaciones en C# con LINQ. La verdad es que he implementado varias veces en mi vida este algoritmo (en varios lenguajes), sin embargo esta implementación en concreto me parece peculiar y me recuerda mucho a la resolución en lenguajes declarativos tipo Prolog. Ahí la dejo por si a alguien le sirve.

using System;
using System.Collections.Generic;
using System.Linq;

namespace Combinatory
{
	public static class Combinatory
	{
		public static IEnumerable<IEnumerable<T>> Combinations<T> (IEnumerable<T> elements, int setLenght)
		{
		int elementLenght=elements.Count ();
			if ( setLenght == 1) 
				return elements.Select(e=>Enumerable.Repeat (e, 1));
			else if(setLenght==elementLenght)
				return Enumerable.Repeat(elements,1);
			else 
			{
				return Combinations (elements.Skip (1), setLenght - 1)
								.Select (tail => Enumerable.Repeat (elements.First (), 1).Union (tail))
								.Union(Combinations (elements.Skip (1), setLenght));
			}
		}
	}
}

2 Responses to Algoritmo de combinaciones con C#/LINQ

  1. Jacano dice:

    Me gusta la idea que usas, me ha llevado un buen rato entenderla xDDD

    El prototipo del método es ultra general y sirve para la mayoría de los tipos de datos en C#, es la caña!

    Y me ha servido de inspiración para hacer otra

    Gracias Pablo!!

  2. x dice:

    Hola Jacano, como saco los elementos del var que regresa el método ??? Saludos

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: