Соедините два списка разных объектов и создайте новый список - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть два списка разных объектов.

List<ObjA> objAs = new List<ObjA>();
List<ObjB> objBs = new List<ObjB>();

Они имеют следующие структуры классов.

public class ObjA
{
    public int Id;
    public int ObjBId;
}

public class ObjB
{
    public int Id;
    public string Title;
}

Присоединение свойства ObjBId objA к свойству Id ObjB Я хочу создать список идентификаторов ObjA вместе с заголовками ObjB. Примерно так:

List<int, string> output = new List<int, string>();
// where int = ObjA's Id, string = ObjB's Title

Как мне это сделать в LINQ? Есть ли альтернатива, кроме использования Concat и создания класса-оболочки?

Ответы [ 4 ]

2 голосов
/ 29 апреля 2020

Enumerable.Join должны помочь вам в этом.

var result = objAs.Join(objBs,x=>x.ObjBId,y=>y.Id,(x,y)=>new {x.Id,y.Title})
                  .ToList();
1 голос
/ 29 апреля 2020

Вы можете использовать метод Join и возвращать результат в виде списка именованных кортежей List<(int, string)> (доступно начиная с C# 7), поскольку List<int, string> не является допустимым C# объявление.

var output = objAs.Join(objBs, a => a.ObjBId, b => b.Id, (a, b) => (a.Id, b.Title)).ToList();

Вы также можете использовать анонимные объекты вместо кортежей, например (a, b) => new { a.Id, b.Title}

0 голосов
/ 29 апреля 2020

Таким образом, для каждого элемента objAs вы хотите взять Id, а если объект с таким же Id находится в objBs, вам нужен Id из objA и заголовок из objB.

Фактически, Поскольку Id для objA и objB равны, вам все равно, берете ли вы Id из objA или objB.

Вы не написали, что хотите, если в objB нет элемента с таким же Я бы. Давайте предположим, что в этом случае вам нужно значение null.

var result = objAs.GroupJoin(objBs,  // GroupJoin A with B
    objA => objA.Id,                 // from every element in A take the Id
    objB => objB.Id,                 // from every element in B take the Id

    // ResultSelector: take all elements of A, each with the matching elements from B
    (objA, matchingObjBs) => new
    {
        Id = objA.Id,
        Title = matchingObjBs.Select(objB => objB.Title).FirstOrDefault(),
    });

Хорошая особенность GroupJoin состоит в том, что вы также получаете элемент из A, у которого нет соответствующего B. И если в B имеется более одного соответствующего элемента. вы берете первый.

Если вы не хотите, чтобы элементы из A, не имеющие совпадающего Id в B, достаточно взять только те элементы из B, которые имеют Id в A:

var idsA = objAs.Select(objA => objA.Id);
var result = objBs.Where(objB => idsA.Contains(objB.Id));
0 голосов
/ 29 апреля 2020

Вы можете использовать объединение и вернуть список

        var result = (from a in objAs
                     join b in objBs on a.ObjBId equals b.Id
                     select new
                     {
                         a.ObjBId,
                         b.Title
                     }).ToList();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...