C# 列出所有可能的组合

C# 列出所有可能的组合,c#,algorithm,C#,Algorithm,我有一个关于组合的问题 我实际上正在开发一个电子商务网站,我有一个功能,让客户创建产品的变种 例如:黑色长裤34W 30L、黑色长裤38W 32L、白色长裤34W 30L。这些被定义为产品变体 假设我的裤子有3个选项,分别是颜色、腰围和长度 我现在有3个列表 ListA = {"black", "white", "red"} //For the color ListB = {30,32,34,36,38} //For the waist ListC ={28,30,32,34} //For th

我有一个关于组合的问题

我实际上正在开发一个电子商务网站,我有一个功能,让客户创建产品的变种

例如:黑色长裤34W 30L、黑色长裤38W 32L、白色长裤34W 30L。这些被定义为产品变体

假设我的裤子有3个选项,分别是颜色、腰围和长度

我现在有3个列表

ListA = {"black", "white", "red"} //For the color
ListB = {30,32,34,36,38} //For the waist
ListC ={28,30,32,34} //For the length
我的问题是如何列出所有可能的组合

我想要的结果应该是{{black,30,28},{black,30,30},{black,30,32},{white,34} ,30}

另外,棘手的是,我不知道客户会为该产品分配多少选项。选项的计数可能只有1,这是最简单的;可能不止3个

问题已解决

因为我们不知道我们会有多少选择。因此,我们不知道要使用多少for循环。换句话说,它变成了一个典型的笛卡尔积

有关更多信息,请阅读以下两个链接。


谢谢你的帮助

如评论中所述,埃里克·利珀特(Eric Lippert)有一篇名为的博客文章,解释了如何解决您的问题。您需要一个扩展方法来计算笛卡尔积:

public static IEnumerable<IEnumerable<T>> CartesianProduct<T>(this IEnumerable<IEnumerable<T>> sequences) {
  IEnumerable<IEnumerable<T>> result = new [] { Enumerable.Empty<T>() };
  foreach (var sequence in sequences) {
    var localSequence = sequence;
    result = result.SelectMany(
      _ => localSequence,
      (seq, item) => seq.Concat(new[] { item })
    );
  }
  return result;
}
要计算笛卡尔积,只需调用扩展方法:

var result = sequences.CartesianProduct();

枚举结果时,它是动态计算的(惰性地)。如果您喜欢创建列表列表,则需要在
Concat
之后以及从扩展方法返回
result
之前调用
ToList()

似乎相关。您看过其他电子商务系统是如何做到这一点的吗?dashCommerce有一个类似的选项,可以从产品变体中生成SKU。我确实得到了一个NopCommerce,并从中学到了一些想法。非常感谢你们两位。非常感谢你提供的线索。笛卡尔积是关键词!谢谢你,伙计,你拯救了世界@Eric Lippert如何使用表达式树进行cartezian乘积计算?我认为它比LINQ函数版本强大得多:我必须在Concat之后加上ToList(),它才能正常工作。(.NETFramework 4.6)@ReinierDG:关于何时使用
ToList
的信息应该在我答案的最后一段。
var result = sequences.CartesianProduct();