很抱歉打开另一篇文章。
我在之前的帖子中问道,但我无法解决我的问题。
`
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 })
但这不正确...
提前谢谢
劳尔
答案 0 :(得分:0)
显然你有一个名为Stops
的序列,它是stop
个对象的序列。每个stop
对象可能有也可能没有InitDate
。如果它有InitDate
,则此InitDate
至少包含属性Month
,Year
和Duration
,这些属性均为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);
你需要做的只是一些订购而且你已经完成了。