C# 在C中的对象列表上按平均值分组#
我有一个对象列表,对象如下所示C# 在C中的对象列表上按平均值分组#,c#,C#,我有一个对象列表,对象如下所示 public class Sample { public DateTime _dt; public decimal _d; public decimal_value; } 我想要一个列表,按日期的年和月以及平均值的d值分组 所以,如果一月的话,这个列表已经 one set of 31 values with _d =1, one set of 31 values with _d =5 样本的结果列表将有两个值 1/1/2016 ,_d
public class Sample
{
public DateTime _dt;
public decimal _d;
public decimal_value;
}
我想要一个列表,按日期的年和月以及平均值的d值分组
所以,如果一月的话,这个列表已经
one set of 31 values with _d =1,
one set of 31 values with _d =5
样本的结果列表将有两个值
1/1/2016 ,_d = 1 and average of _value
1/1/2016 ,_d = 5 and average of _value
首先,我们必须重新定义
示例
类
public class Sample
{
public DateTime _dt { get; set; }
public decimal _d { get; set; }
public decimal _value { get; set; }
}
如果我们有一个名为samples
的samples
对象列表,那么类似这样的东西会满足您的需要:
var results = samples.GroupBy(sample => { Year = _dt.Year, Month = _dt.Month DValue = _d})
.Select(gr => new {
Year = gr.Key.Year,
Month = gr.Key.Month,
DValue = gr.Key.DValue,
AverageValue = gr.Select(item => item.Value).Average()
});
这似乎有效:
var results = samples
.GroupBy(g => new {
Year = g._dt.Year,
Month = g._dt.Month,
_d = g._d })
.Select(s => new {
Year = s.Key.Year,
Month = s.Key.Month,
_d = s.Key._d,
Avg = s.Average(a => a._value) });
为了更好,我将修改您的属性命名约定,以选择样式和名称。公共属性应该是Pascal大小写的,它们的名称应该更具描述性,特别是当您不打算为类提供摘要元数据时。例如:
public class Sample
{
/// <summary>
/// Gets or sets the sample's date
/// </summary>
public DateTime Date
{
get;
set;
}
/// <summary>
/// Gets or sets the sample's index
/// </summary>
public decimal Index
{
get;
set;
}
/// <summary>
/// Gets or sets the sample's value
/// </summary>
public decimal Value
{
get;
set;
}
公共类示例
{
///
///获取或设置样本的日期
///
公共日期时间日期
{
得到;
设置
}
///
///获取或设置样本的索引
///
公共十进制索引
{
得到;
设置
}
///
///获取或设置样本的值
///
公共十进制值
{
得到;
设置
}
我已将名称“_dt”、“_d”和“_value”分别转换为“日期”、“索引”和“值”
带驼峰大小写的下划线样式(例如“_descriptivePropertyName”)通常保留给类中的私有字段,以及其他情况。编辑为公共。尝试找出linq方式,而不是运行循环并根据列表中的第一个实例查询月/年的剩余可用天数。