加入两个对象列表:一个列表中的所有属性,另一个列表中的某些属性
Join two lists of objects: All properties from one list, only certain properties from the other one
我有两个 classes:
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; }
}
我为每个列表创建了两个列表 class:
public List<Class1> listClass1 { get; set; } = new List<Class1>();
public List<Class2> listClass2 { get; set; } = new List<Class2>();
现在我想通过加入 ProductID
上的两个列表来创建一个新列表,其中包含来自 Class1
的所有属性以及来自 [=16] 的 UpdateTime
和 ItemState
=].最好的方法是什么?
(最终目标是让用户保存当前会话,让他以后继续他的工作,为此我需要完整的listClass1
和提到的listClass2
的属性。想法是在合并列表上使用 XmlSerializer
并将其保存到 XML 文件中。要打开文件,我想反序列化它。如果你有更好的方法让用户保存他的会话, 我洗耳恭听。)
我建议制作第三个 class 代表加入的参数集。
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();
说明:您在特定 属性 上加入了项目。如果它在两个列表中是相等的,您将获取该项目并构建一个具有 selected 属性的新项目。在没有 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();
我有两个 classes:
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; }
}
我为每个列表创建了两个列表 class:
public List<Class1> listClass1 { get; set; } = new List<Class1>();
public List<Class2> listClass2 { get; set; } = new List<Class2>();
现在我想通过加入 ProductID
上的两个列表来创建一个新列表,其中包含来自 Class1
的所有属性以及来自 [=16] 的 UpdateTime
和 ItemState
=].最好的方法是什么?
(最终目标是让用户保存当前会话,让他以后继续他的工作,为此我需要完整的listClass1
和提到的listClass2
的属性。想法是在合并列表上使用 XmlSerializer
并将其保存到 XML 文件中。要打开文件,我想反序列化它。如果你有更好的方法让用户保存他的会话, 我洗耳恭听。)
我建议制作第三个 class 代表加入的参数集。
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();
说明:您在特定 属性 上加入了项目。如果它在两个列表中是相等的,您将获取该项目并构建一个具有 selected 属性的新项目。在没有 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();