Linq 连接两个相似的对象列表

本文关键字:相似 对象 列表 两个 连接 Linq | 更新日期: 2023-09-27 18:20:08

objA = new obj()
{
    ID = 123,
    attriA = "",
    attriB = "someValueB"
}
objB = new obj()
{
    ID = 123,
    attriA = "someValueA",
    attriB = ""
}
List<obj> ListA = new List<obj>();
ListA.add(objA);
List<obj> ListB = new List<obj>();
ListB.add(objB);

鉴于上述情况,我需要对以下对象进行listC

objC = new obj()
{
    ID = 123,
    attriA = "someValueA",
    attriB = "someBalueB"
}

这就是我尝试过的。它有效,但我认为一定有办法通过使用我不知道的 linQ 来缩短代码:

foreach(obj item in ListA)
{
    obj objB = ListB.Where(x=> x.ID == item.ID).FirstOrDefault();
    obj objC = new obj(){
        ID = objB.ID;
        attriA = item.attriA;
        attriB = objB.attriB;
    };
    ListC.add(objC);
}

Linq 连接两个相似的对象列表

你可以使用 linq join,如下所示

 var query = from a in ListA
                join b in ListB
                     on a.ID equals b.ID
                select new Obj()
                {
                     ID = b.ID;
                attriA = a.attriA;
             attriB = b.attriB;
                };

上面的代码未经测试

如果总是有字符串,你可以这样说:

var listC = ListA.Join(ListB, 
            A => A.ID, B => B.ID, 
            (A, B) => new {
                ID = A.ID,
                attriA = !string.IsNullOrEmpty(A.attriA) ? A.attriA : B.attriA,
                attriB = !string.IsNullOrEmpty(B.attriB) ? B.attriB : A.attriB
            });