Внутреннее объединение двух списков на основе дочернего списка - PullRequest
0 голосов
/ 03 января 2019

У меня есть два списка различных типов пользовательских объектов, и я пытаюсь выполнить внутреннее соединение, где критерии объединения содержатся в дочернем списке объектов.

Вот пример моих объектов:

public class Container
{
    public List<Reference> Refs;

    public Container(List<Reference> refs )
    {
        Refs = refs;
    }
}

public class Reference
{
    public int Id;

    public Reference(int id )
    {
        Id = id;
    }
}

А вот пример данных, с которыми я работаю:

List<Container> containers = new List<Container>()
{
    new Container(new List<Reference>()
    {
        new Reference(1),
        new Reference(2),
        new Reference(3)
    }),

    new Container(new List<Reference>()
    {
        new Reference(4),
        new Reference(5),
        new Reference(6)
    })
};

List<Reference> references = new List<Reference>()
{
    new Reference(4),
    new Reference(5),
    new Reference(6)
};

Я пытаюсь выбрать все Container в List<Container>, которые имеют Reference в List<Reference> на основе Reference.Id. С этими данными я ожидаю, что будет выбран только второй элемент в List<Container>.

Если бы это был правильный синтаксис, я бы хотел сделать что-то вроде:

var query = from c in containers
            join r in references on c.Refs.Contains( r.Id )
            select c;

Как это можно сделать? Спасибо


Извините за плохой титул. Я изо всех сил стараюсь описать этот сценарий в короткой группе слов - пожалуйста, предложите изменить, если вы можете придумать что-то более подходящее. Спасибо

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Я бы использовал:

var query = from c in containers where c.Refs.SequenceEqual(references)
                select c;

Присоединение не требуется.

0 голосов
/ 03 января 2019

внутреннее объединение здесь не требуется, вам лучше без него:

containers.Where(c => c.Refs.Any(x => references.Any(e => x.Id == e.Id)));

или если вы хотите, чтобы весь набор идентификаторов был равен, используйте SequenceEqual:

var sequence = references.Select(e => e.Id);
var result = containers.Where(c => c.Refs.Select(s => s.Id).SequenceEqual(sequence));
0 голосов
/ 03 января 2019
containers.Where(c => c.Refs.Select(r => r.Id).Intersect(references.Select(r => r.Id)).Any());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...