我有两个班级:
class Class1
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public int Amount { get; set; }
public string Category { get; set; }
}
class Class2
{
public id ProductId { get; set; }
public DateTime UpdateTime { get; set; }
public int ItemState { get; set; }
public decimal Price { get; set; }
public string ImageUrl { get; set; }
}
我为这个类创建了两个列表:
public List<Class1> listClass1 { get; set; } = new List<Class1>();
public List<Class2> listClass2 { get; set; } = new List<Class2>();
现在,我想通过加入ProductID
上的两个列表来创建一个新列表,其中包含来自Class1
的所有属性以及来自UpdateTime
的{{1}}和ItemState
。这样做的最佳方式是什么?
(最终目标是让用户保存当前会话以便让他继续工作,为此我需要完整的Class2
和listClass1
提到的属性。这个想法是在合并列表上使用listClass2
并将其保存到XML文件中。要打开文件,我想反序列化它。如果你有更好的方法让用户保存他的会话,我都是耳朵。)
答案 0 :(得分:0)
我建议创建一个代表连接参数集的第三个类。
public class Class1_2
{
public int ProductId { get; set; }
public string ProductName { get; set; }
public int Amount { get; set; }
public string Category { get; set; }
public DateTime UpdateTime { get; set; }
public int ItemState { get; set; }
}
LINQ Join 2 Lists中介绍了如何加入2个列表。所以你最终会得到这样的东西:
List<Class1_2> joinedList = (from item1 in listClass1
join item2 in listClass2
on item1.ProductId equals item2.ProductId
select new Class1_2
{
ProductId = item1.ProductId,
Amount = item1.Amount,
ProductName = item1.ProductName,
Category = item1.Category,
ItemState = item2.ItemState,
UpdateTime = item2.UpdateTime
}).ToList();
说明:您加入特定属性上的项目。如果两个列表中的值相等,则您将使用该项目并使用选定的属性构建一个新项目。加入也可以在没有Class1_2
的情况下工作,但是您会得到dynamic
类型的结果。新Class_1_2
的优点是您可以使用它来定义结构的序列化。
修改强>
您还可以在Class1_2
public Class1_2(Class1 c1, Class2 c2)
{
ProductId = c1.ProductId;
Amount = c1.Amount;
ProductName = c1.ProductName;
Category = c1.Category;
ItemState = c2.ItemState;
UpdateTime = c2.UpdateTime;
}
将select
语句简化为:
select new Class1_2(item1, item2)).ToList();