【问题标题】:Inner join two lists based on a child list基于子列表的内连接两个列表
【发布时间】:2019-05-30 03:34:57
【问题描述】:

我有两个不同类型的自定义对象列表,我正在尝试执行内部连接,其中连接条件包含在对象的子列表中。

这是我的对象的一个​​示例:

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)
};

我正在尝试根据Reference.IdList&lt;Reference&gt; 中选择List&lt;Container&gt; 中具有匹配Reference 的所有Containers。有了这些数据,我希望只选择List&lt;Container&gt; 中的第二项。

如果它是有效的语法,我会按照以下方式做一些事情:

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

如何做到这一点?谢谢


抱歉标题不好。我正在努力将这种情况放在一小段文字中 - 如果您能想到更合适的内容,请提出修改建议。谢谢

【问题讨论】:

  • 我可能会建议使用实现 iequatable 的 list 的继承类...然后您可以使用序列等于检查给定的 list 是否与您的列表匹配...请参阅此详情 - docs.microsoft.com/en-us/dotnet/api/…

标签: c# list linq join


【解决方案1】:

这里不需要内部连接,没有它你会更好:

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

或者,如果您希望整个 Id 集相等,则使用 SequenceEqual:

var sequence = references.Select(e => e.Id);
var result = containers.Where(c => c.Refs.Select(s => s.Id).SequenceEqual(sequence));

【讨论】:

    【解决方案2】:
    containers.Where(c => c.Refs.Select(r => r.Id).Intersect(references.Select(r => r.Id)).Any());
    

    【讨论】:

      【解决方案3】:

      我会使用:

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

      不需要加入。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-22
        • 1970-01-01
        • 2016-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多