更新:将类名更改为ComboProduct和Product,以便清除
public class Product
{
public string Name {get; set;}
}
public class ComboProduct
{
public int Id;
public List<Product> ProductList {get; set;}
}
public class ProductStock
{
public Product Product {get; set;}
public int Quantity {get; set;}
public double Price {get; set;}
}
public class Result
{
public int ComboProductId {get; set;}
public int Quantity {get; set;}
public double Price {get; set;}
}
个字符
如何使用Linq将ProductStock分组为一个新的组合列表,如下所示:
{ ComboProductId,Price:priceA + priceB + priceC Quantity:Min(quantityA,quantityB,quantityC)}
我尝试使用C#算法,但希望帮助使用Linq实现它。
Expected result:
| ComboProductId Price Quantity
(A1,B1,C1) | 1 140 5
(A2,B1,C1) | 1 145 25
(A2,B2,C1) | 1 150 9
…
(A3,B1,C2) | 1 120 25
…
型
2条答案
按热度按时间a11xaf1n1#
为了更容易地跟踪提供结果的数据,我在
ProductStock
和Result
类中各添加了一个属性。字符串
以下代码将:
1.对于所选ComboProduct中的每个Product,收集匹配ProductStock项目的列表。
1.将数据组织为列表的列表的列表,其中:(a)外部列表是产品分组,每个产品有一个物料。(B)中间列表表示所有组合(最初,当前产品组中的每个库存物料有一个物料)。(c)内部列表表示此组合的所有构成库存物料(最初,只有一个库存物料)。
1.使用.Aggregate()重复执行初始组与其余组的叉积。一个组中的N个组合与另一个组中的M个组合的叉积将生成N * M个新组合。系统将建立起库存物料的内部列表,以包括两个组合中的物料。
1.此时的结果将是一个库存项目列表。外部列表代表所有组合。内部列表包含所有构成此组合的库存项目。
1.最后,将这些组合Map到具有ComboProductId、ProductStock列表、最小数量和总价的Result对象。
型
结果如下:
| 组合产品标识|库存物品|价格|数量|
| --|--|--|--|
| 1 |(A1、B4、C6)| 140 | 5 |
| 1 |(A1、B4、C7)| 110 | 5 |
| 1 |(A1、B4、C8)| 130 | 5 |
| 1 |(A1、B5、C6)| 145 | 5 |
| 1 |(A1、B5、C7)| 115 | 5 |
| 1 |(A1、B5、C8)| 135 | 5 |
| 1 |(A2、B4、C6)| 145 | 25 |
| 1 |(A2、B4、C7)| 115 | 25 |
| 1 |(A2、B4、C8)| 135 | 25 |
| 1 |(A2、B5、C6)| 150 | 9 |
| 1 |(A2、B5、C7)| 120 | 9 |
| 1 |(A2、B5、C8)| 140 | 9 |
| 1 |(A3、B4、C6)| 150 | 25 |
| 1 |(A3、B4、C7)| 120 | 25 |
| 1 |(A3、B4、C8)| 140 | 25 |
| 1 |(A3、B5、C6)| 155 | 9 |
| 1 |(A3、B5、C7)| 125 | 9 |
| 1 |(A3、B5、C8)| 145 | 9 |
请参阅this .NET fiddle,以取得包含其他测试数据的示范。
我有两种可能的解决方案。这两种方案都是从对初始数据项进行分组并分配序号开始的。每个组都可以被看作是一个要与其他组交叉联接的项表。然后使用
.Aggregate()
函数在组之间重复应用交叉联接。结果是所有所需组合的列表。这两种方法(如下所示)的区别在于,第一种方法在每个组中构建一个
ClassA
结果对象的初始集,然后在每次类应用迭代时生成新的组合ClassA
对象。第二种方法只是根据初始数据建立起一个有贡献的ClassB
项的列表,并将最终ClassA
结果的构造推迟到所有的交叉连接已完成。最终结果是相同的,但可能存在性能差异。
型
结果如下:
| 项目|价格|数量|
| --|--|--|
| (A1、B1、C1)| 140 | 5 |
| (A1、B1、C2)| 110 | 5 |
| (A1、B1、C3)| 130 | 5 |
| (A1、B2、C1)| 145 | 5 |
| (A1、B2、C2)| 115 | 5 |
| (A1、B2、C3)| 135 | 5 |
| (A2、B1、C1)| 145 | 25 |
| (A2、B1、C2)| 115 | 25 |
| (A2、B1、C3)| 135 | 25 |
| (A2、B2、C1)| 150 | 9 |
| (A2、B2、C2)| 120 | 9 |
| (A2、B2、C3)| 140 | 9 |
| (A3、B1、C1)| 150 | 25 |
| (A3、B1、C2)| 120 | 25 |
| (A3、B1、C3)| 140 | 25 |
| (A3、B2、C1)| 155 | 9 |
| (A3、B2、C2)| 125 | 9 |
| (A3、B2、C3)| 145 | 9 |
请注意,有几行中的Quantity值与原始post预期结果不匹配,但我相信这些结果是正确的,而原始post预期结果是错误的。
请参见this .NET Fiddle。
ifmq2ha22#
如果我清楚地理解了这个要求。你可以这样做。
字符串