using System.Collections.Generic;
public class ProductVariantModel
public string Name { get; set; }
public string Options { get; set; }
public string Name { get; set; }
public IList<ProductVariantModel> Variants { get; set; }
public class ProductVariantOption {
public string Name { get; set; }
private static ProductVariantOption BuildModel(string[] modelParts) {
if (modelParts.Length == 1) {
return new ProductVariantOption {
Name = modelParts.Single()
var baseName = modelParts.First();
var variantParts = string.Join('/', modelParts.Skip(1));
return new ProductVariantOption {
Name = $"{baseName}-{variantParts}"
public static IList<ProductVariantOption> GetVariants(CreateModel model) {
var allVariables = model.Variants.Select(v => v.Options.Split(",")).ToArray();
var initialParts = new List<string[]> { new[] { model.Name } };
var allModels = allVariables.Aggregate(initialParts, (variantsSoFar, variableValues) =>
.SelectMany(variant => variableValues.Select(variableValue => variant.Append(variableValue).ToArray()))
return allModels.Select(BuildModel).ToList();
public static void Main()
var testModel = new CreateModel {
Variants = new List<ProductVariantModel> {
new ProductVariantModel {
new ProductVariantModel {
new ProductVariantModel {
var productOptions = GetVariants(testModel);
Console.WriteLine(string.Join("\n", productOptions.Select(it => it.Name)));