【发布时间】:2021-01-10 22:28:14
【问题描述】:
为了展示我想要实现的目标,我准备了一个简化的示例:
假设我有一个这样的对象:
public class SoldProduct
{
public string Name { get; set; }
public DateTime Date { get; set; }
}
然后,在某处我有一个方法可以获取SoldProduct(来自不同类别)的不同列表,如下所示:
List<SoldProduct> toolsSold = GetToolSales();
List<SoldProduct> materialsSold = GetMaterialSales();
List<SoldProduct> foodsSold = GetFoodSales();
现在,我需要将它们合并到一个行列表中,其中一行是这样的:
public class SoldProductRow
{
public SoldProduct ToolSold { get; set; }
public SoldProduct MaterialSold { get; set; }
public SoldProduct FoodSold { get; set; }
}
问题:
那么,如何将这 3 个列表转换为 List<SoldProductRow>?是否有一些简单、高效的 LINQ 查询?也许有一种非常简单有效的手动编写方式?
让我们假设这一行类似于 Excel 行;我们希望有 2 列用于工具销售的名称和日期,2 列用于材料销售的名称和日期,以及 2 列用于食品销售的名称和日期。 基本上并排列出它们。
困难:
列表可以有不同的长度,所以如果我们在 toolsSold 中有 3 个元素,但在 materialsSold 和 foodsSold 中有 5 个元素,那么行列表应该有 5 个元素(最长列表长度),其中前 3 个元素行列表将具有所有属性,但第 4 和第 5 个元素应在 ToolSold 中具有 null 并在 MaterialSold 和 FoodSold 中具有适当的值
List<SoldProduct> 的长度通常在 1 到 3 之间,但实际上 List<Parent> 可能有数百个对象,每个父级有 5 个 List<SoldProduct> 所以,我需要创建数百行。
示例:
如果我有清单:
toolsSold: [
{Name: hammer, Date:24-09-2020}
]
materialsSold: [
{Name: wood, Date:23-09-2020},
{Name: steel, Date:17-08-2020}
]
foodsSold: [
{Name: apple, Date:07-02-2020}
]
我想要这个结果(2 行,因为最长的列表有 2 个实体):
SoldProductsRows: [
{
ToolSold: {Name: hammer, Date:24-09-2020}
MaterialSold: {Name: wood, Date:23-09-2020}
FoodSold: {Name: apple, Date:07-02-2020}
},
{
ToolSold: null
MaterialSold: {Name: steel, Date:17-08-2020}
FoodSold: null
},
]
【问题讨论】:
-
不同列表之间有什么关系?产品名称?还是日期?我们如何知道“行”中的内容是什么?
-
它们没有关系,这就是为什么在行类中每个列表都有属性。
-
我添加了类似 json 的示例,以更好地展示我想要实现的目标