将对象列表中的值添加到另一个不同对象列表中

时间:2018-04-20 22:21:56

标签: c# linq

我有这个场景

class A
{
    public string id { get; set; }
    public string val1 { get; set; }
    public string val2 { get; set; }
    public string val3 { get; set; }
    public string val4 { get; set; }
    public string val5 { get; set; }
}

class B
{
    public string id { get; set; }
    public string val2 { get; set; }
    public string val3 { get; set; }
}

List<A> lista = new List<A>(); //10 items

List<B> listb = new List<B>(); //400 items

我想在A中存储与B字段idval2 val3匹配的Bval2的{​​{1}}和val3A),我该怎么做?

3 个答案:

答案 0 :(得分:1)

创建新对象

您可以使用LINQ / Select将B转换为A并使用AddRange添加它们。

lista.AddRange
(
    listb.Select
    (
        b => new A 
        { 
            id   = b.id, 
            val2 = b.val2, 
            val3 = b.val3 
        } 
    )
);

将两种类型的对象放在同一列表中

或者,如果您真的希望将A和B都存储在同一个列表中,则可以设置继承关系:

class B
{
    public string id { get; set; }
    public string val2 { get; set; }
    public string val3 { get; set; }
}

class A : B
{
    public string val1 { get; set; }
    public string val4 { get; set; }
    public string val5 { get; set; }
}

var listb = new List<B>();

现在你的列表可以存储A和B,因为A是B的特化。所以你可以这样做:

listb.AddRange(lista);

到位更新

如果要将原始对象保留在lista中并且只想更新匹配的属性,则应该使用循环。如果你真的想要的话,可以使用LINQ来实现它,但它实际上不是“意味着”用于更新现有的东西。

由于您获得了查找功能,因此可以使您在字典中存储As更容易一些。字典在内部使用哈希表,因此您也可以获得比扫描更好的性能。因为字典只包含引用,所以原始列表中的对象也会更新。

var dictionarya = lista.ToDictionary
(
    item => item.id,
    item => item
);
foreach (var b in listb)
{
    A a;
    if (dictionarya.TryGetValue(b.id, out a))
    {
        a.val2 = b.val2;
        a.val3 = b.val3;
    }
}

答案 1 :(得分:1)

以下LINQ查询可以帮助您:

lista.AddRange(from b in listb
               let a = new A { id = b.id, val2 = b.val2, val3 = b.val3}
               where lista.Any(x => x.id == a.id)
               select a);

这将选择与lista中的值共享ID的所有B的列表,然后将结果添加到lista。

答案 2 :(得分:0)

似乎对[^a-zA-Z0-9]?子句做得很好:

Join

这将完成您对&#34;我希望存储在var result = lista.Join(listb, a => a.id, b => b.id, (a, b) => new A { id = a.id, val2 = b.val2, val3 = b.val3 }); 中的A值与B字段&#34;的匹配。

如果相反,您希望将id子句的结果累加到Join,那么您可以使用lista方法:

AddRange