在C#中的对象列表上按平均分组

时间:2016-02-05 23:48:57

标签: c#

我有一个对象列表,其中对象如下所示

public class Sample
{
    public DateTime _dt;
    public decimal _d;
    public decimal_value;
}

我想要一个按日期和月份分组的列表和_d值平均值的_d值。

因此,如果是1月,则列表

one set of 31 values with _d =1, 
one set of 31 values with _d =5

Sample的结果列表将有两个值

1/1/2016 ,_d = 1 and average of _value
1/1/2016 ,_d = 5 and average of _value

2 个答案:

答案 0 :(得分:0)

最初我们必须重新定义Sample类。

public class Sample
{
    public DateTime _dt   { get; set; }
    public decimal _d     { get; set; }
    public decimal _value { get; set; }
}

如果我们有一个名为Sample的{​​{1}}个对象列表,那么你想做的就是这样:

samples

答案 1 :(得分:0)

这似乎有效:

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 Case,它们的名称应该更具描述性,特别是如果您不打算向您的类提供摘要元数据。例如:

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”分别转换为“Date”,“Index”和“Value”。

Camel Case的样式下划线(例如“_descriptivePropertyName”)通常保留给类中的私有字段,以及其他情况。