CSharp · Console
using System;
using System.Collections.Generic;
using System.Linq;
public class Program
{
public static void Main()
{
var listaValores = new List<Dados>()
{
new Dados { Id = 1, Valor = 100.00M},
new Dados { Id = 2, Valor = 200.00M},
new Dados { Id = 3, Valor = 300.00M},
new Dados { Id = 4, Valor = 400.00M},
new Dados { Id = 5, Valor = 500.00M}
};
var soma = 1000;
foreach (string s in OterCombinacoes(listaValores, soma, ""))
{
Console.WriteLine($"Somando os valores do id {s} totalizando os {soma}");
}
}
public static IEnumerable<string> OterCombinacoes(List<Dados> dados, decimal sum, string values)
{
for (int i = 0; i < dados.Count; i++)
{
decimal resto = sum - dados[i].Valor;
string vals = dados[i].Id + "," + values;
if (resto == 0)
{
yield return vals;
}
else
{
List<Dados> dadosPossiveis = dados.Take(i).Where(n => n.Valor <= sum).ToList();
if (dadosPossiveis.Count > 0)
{
foreach (string s in OterCombinacoes(dadosPossiveis, resto, vals))
{
yield return s;
}
}
}
}
}
}
public class Dados
{
public int Id { get; set; }
public decimal Valor { get; set; }
}