SelectMany c#linq

时间:2017-06-15 08:52:42

标签: c# linq

很抱歉打开另一篇文章。

.SelectMany with C#

我在之前的帖子中问道,但我无法解决我的问题。

`

var departments = stops 
    .Where(stop => stop.InitDate != null)
    .SelectMany(stop => new[] { Month = stop.InitDate.Month, Year = stop.InitDate.Year, Duration = stop.Duration })
    .GroupBy(dt => new { dt.Month, dt.Year }) 
    .OrderBy(g => g.Key.Month)
    .ThenBy(g => g.Key.Year) 
    .Select(g => new 
    { 
        Key = g.Key.Month, 
        Año = g.Key.Year, 
        Duration = g.Sum(v => v.Duration), 
        Count = g.Count() 
    });

`

这是我的问题的最终解决方案,但是,当我在我的代码中使用它时,我遇到了一些问题。

如果我没有声明变量“Month,Year,Duration”,我会收到错误: .SelectMany(stop => new[] { Month = stop.InitDate.Month, Year = stop.InitDate.Year, Duration = stop.Duration })

但我不知道它们是月份和年份的数据类型,因为如果我声明它是多少整数,我在.GroupBy(dt => new { dt.Month, dt.Year })中得到一个错误,因为编译器将dt识别为整数。

我尝试将Month和Year声明为整数并放入.GroupBy: .GroupBy(dt => new { Month, Year })但这不正确...

提前谢谢

劳尔

1 个答案:

答案 0 :(得分:0)

显然你有一个名为Stops的序列,它是stop个对象的序列。每个stop对象可能有也可能没有InitDate。如果它有InitDate,则此InitDate至少包含属性MonthYearDuration,这些属性均为int

您想要的是原始Stops,只有那些stop的{​​{1}}个对象。从您选择的每个InitDate对象中,您想要创建一个新对象,其中stop属性包含Month和Year,以及Key属性,其中包含持续时间。

  

你快到了。您的问题是您使用的是Duration而不是简单的SelectMany

如果您有一系列要连接成一个序列的序列,通常使用Select。但是,您的SelectMany没有序列序列。每个Stops对象都应生成一个带有年,月和持续时间的新对象"。

或者用简单的话说:每当你收集了一些" thingies"而且你想转换每一个" thingy"在#34}中,你应该使用stop,而不是Select

在您的情况下,选择将是:

SelectMany

我将年份和月份放在属性GroupKey中,因为这样可以简化分组:

var stopData = stops 
   .Where(stop => stop.InitDate != null)
   .Select(stop => new
   { 
       GroupKey = new 
       {
           Month = stop.InitDate.Month,
           Year = stop.InitDate.Year,
       },
       Duration = stop.Duration
   });

现在每个组都包含一个密钥,即{Month,Year}。该组的元素都是{月,年}的持续时间。所以你现在需要做的就是从每个组中获取组中的所有元素以及Sum()和Count()它们:

var groupsOfSameMonth = stopData
    .GroupBy( item => item.Key, item => item.Duration);

你需要做的只是一些订购而且你已经完成了。