C# 列出所有可能的组合
我有一个关于组合的问题 我实际上正在开发一个电子商务网站,我有一个功能,让客户创建产品的变种 例如:黑色长裤34W 30L、黑色长裤38W 32L、白色长裤34W 30L。这些被定义为产品变体 假设我的裤子有3个选项,分别是颜色、腰围和长度 我现在有3个列表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
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();