Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 根据C中的匹配值将列表项合并为单个项_C#_Linq - Fatal编程技术网

C# 根据C中的匹配值将列表项合并为单个项

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

我有一个项目列表列表activityForecast:

我想要像这样的合并:基于日期和类别合并类似对象的列表,并将类型连接到单个列中

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