linq联合合并子列表
给出如下对象列表:linq联合合并子列表,linq,unions,Linq,Unions,给出如下对象列表: Instance - InstanceID Version - VersionID - List<Instance> Instances Activity - ActivityID - List<Version> Versions 只是不知道如何到达实例级别 (from activity in activities select new { activity.ActivityID, Instances =
Instance
- InstanceID
Version
- VersionID
- List<Instance> Instances
Activity
- ActivityID
- List<Version> Versions
只是不知道如何到达实例级别
(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()
});
您可以使用自定义的IEqualityComparer
,使用不同的重新调整GroupBy逻辑的速度:
var result=activities。选择(a=>new
{
a、 活动ID,
Instances=a.Versions.SelectMany(v=>v.Instances)
.Distinct(新InstanceComparer())
托利斯先生()
});
类实例比较程序:IEqualityComparer
{
公共布尔等于(实例x、实例y)
{
返回x.InstanceID==y.InstanceID;
}
public int GetHashCode(实例obj)
{
返回obj.InstanceID.GetHashCode();
}
}
我没有做过空检查,但它们很琐碎。当然,这是假设这是LINQ to Object,因为没有其他标签表明这一点。您必须展示您的尝试,我们将尽力帮助您解决任何问题。不是我需要密码,给我密码!网站…谢谢-刚刚发布了获得它。我会给你一个积分:)
(from activity in activities
select new { activity.ActivityID,
Instances = activity.ActivityVersions.SelectMany(v => v.ActivityInstances).AsEnumerable() });
var result = activities.Select(a => new
{
a.ActivityId,
Instances = a.Versions.SelectMany(v => v.Instances)
.GroupBy(i => i.InstanceID)
.Select(grp => grp.First())
.ToList()
});
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();
}
}