C# 根据C中的匹配值将列表项合并为单个项
我有一个项目列表列表activityForecast: 我想要像这样的合并:基于日期和类别合并类似对象的列表,并将类型连接到单个列中C# 根据C中的匹配值将列表项合并为单个项,c#,linq,C#,Linq,我有一个项目列表列表activityForecast: 我想要像这样的合并:基于日期和类别合并类似对象的列表,并将类型连接到单个列中 ArDate Category Type Arr Dep Slp ---------- --------- ------ ----- ---- ---- 11-08-2019 I S,A,D 5 7 6 11-08-2019 R A
ArDate Category Type Arr Dep Slp
---------- --------- ------ ----- ---- ----
11-08-2019 I S,A,D 5 7 6
11-08-2019 R A 0 10 0
12-08-2019 I A 5 0 0
这就是我尝试的,使用GroupBy
var result = activityForecast.GroupBy(c => new
{
c.ArrivalDate,
c.Category
})
.Select(o =>
{
return new ActivityForecast
{
ArDate = o.First().ArDate,
Category = o.First().Category,
ArrvlRms = o.First().Arr,
Type = o.First().Type,
Dep = o.First().Dep,
Slp = o.First().Slp
};
});
但结果是这样的
ArDate Category Type Arr Dep Slp
---------- --------- ------ ----- ---- ----
11-08-2019 I D 0 0 6
11-08-2019 R A 0 10 0
12-08-2019 I A 5 0 0
您需要求和以获得Arr、Dep和Slp属性。对于类型,执行string.Join。更新代码如下:
var result = activityForecast.GroupBy(c => new
{
c.ArrivalDate,
c.Category
})
.Select(o =>
{
var first = o.First();
return new ActivityForecast
{
ArDate = first.ArDate,
Category = first.Category,
ArrvlRms = o.Sum(g => g.Arr),
Type = string.Join(",", o => o.Select(g => g.Type)),
Dep = o.Sum(g => g.Dep),
Slp = o.Sum(g => g.Slp)
};
});
检查dotnet fiddle,它演示了类似的stirng.Join和Sum linq操作,以获得分组数据 您正在寻找GroupBy;分组后,应将每个组转换为单个ActivityForecast实例:
List<ActivityForecast> activityForecast = ...
var result = activityForecast
.GroupBy(forecast => new {
forecast.ArDate,
forecast.Category,
})
.Select(group => new ActivityForecast() {
// These values are taken from Key:
ArDate = group.Key.ArDate,
Category = group.Key.Category,
// These values should be aggregated over group:
// Providing that Type is string
Type = string.Join(",", group.Select(item => item.Type).Distinct()),
//TODO: put correct aggregate function here (Sum? Max?)
Arr = group.Sum(item => item.Arr),
Dep = group.Sum(item => item.Dep),
Slp = group.Sum(item => item.Slp),
});
问题在哪里?将所有类型加入组o。选择a=>a.Type。。。编辑:和其他stuff@Downvoters:我至少尝试了60%。我的属性类型“type”是字符串,因此它无法将lambda exp转换为类型string[]。我只是按照@Dmitry的建议使用了代码,它起了作用。非常感谢。
List<ActivityForecast> activityForecast = ...
var result = activityForecast
.GroupBy(forecast => new {
forecast.ArDate,
forecast.Category,
})
.Select(group => new ActivityForecast() {
// These values are taken from Key:
ArDate = group.Key.ArDate,
Category = group.Key.Category,
// These values should be aggregated over group:
// Providing that Type is string
Type = string.Join(",", group.Select(item => item.Type).Distinct()),
//TODO: put correct aggregate function here (Sum? Max?)
Arr = group.Sum(item => item.Arr),
Dep = group.Sum(item => item.Dep),
Slp = group.Sum(item => item.Slp),
});