加入两个对象列表:一个列表中的所有属性,另一个列表中的某些属性

时间:2017-02-09 09:20:54

标签: c# linq xmlserializer

我有两个班级:

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 。这样做的最佳方式是什么?

(最终目标是让用户保存当前会话以便让他继续工作,为此我需要完整的Class2listClass1提到的属性。这个想法是在合并列表上使用listClass2并将其保存到XML文件中。要打开文件,我想反序列化它。如果你有更好的方法让用户保存他的会话,我都是耳朵。)

1 个答案:

答案 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();