linq union合并子列表

标签 linq unions

给定一个对象列表如下:

Instance
 - InstanceID

Version
 - VersionID
 - List<Instance> Instances

Activity
 - ActivityID 
 - List<Version> Versions

我想生成这样的列表:

Activity
 - ActivityID
 - List<Instance> Instances

目前停留在:

(from activity in activities
 select new {
            activity.ActivityID,
            VersionGroup = (from version in activity.Versions
                            group version by version.ActivityID into versionGroup
                            select versionGroup)
            })

只是不确定如何到达实例级别。

(from activity in activities
 select new { activity.ActivityID,
              Instances = activity.ActivityVersions.SelectMany(v => v.ActivityInstances).AsEnumerable() });

最佳答案

您可以使用 SelectMany展平子列表的方法:

var result = activities.Select(a => new
{
    a.ActivityId, 
    Instances = a.Versions.SelectMany(v => v.Instances)
                          .GroupBy(i => i.InstanceID)
                          .Select(grp => grp.First())
                          .ToList()
});

您可以将 GroupBy 逻辑替换为 Distinct自定义 IEqualityComparer<Instance> :

var result = activities.Select(a => new
{
    a.ActivityId, 
    Instances = a.Versions.SelectMany(v => v.Instances)
                          .Distinct(new InstanceComparer())
                          .ToList()
});

class InstanceComparer : IEqualityComparer<Instance>
{

    public bool Equals(Instance x, Instance y)
    {
        return x.InstanceID == y.InstanceID;
    }

    public int GetHashCode(Instance obj)
    {
        return obj.InstanceID.GetHashCode();
    }
}

我还没有做 null 检查,但它们很简单。当然,这是假设这是 LINQ to Object,因为没有其他标记。

关于linq union合并子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24248765/

相关文章:

c# - 是否有 LINQ 等效方法?

c# - 有没有办法在没有 Linq to Entities 的情况下使用 SqlSpatialFunctions?

c# - 在 lucene 搜索之前,我如何通过外键过滤我的数据?

c - const-casting 是通过 union 未定义的行为吗?

c++ - 访问不活动的 union 成员和未定义的行为?

c# - linq 成员不支持 SQL 转换

c# - LINQ Where和FirstOrDefault

c++ - 以 std::bitset 访问 std::uint8_t

C - 无法将无符号字符数组转换为 double

c - 当我们覆盖 C 中的 union 字段时会发生什么?