我应该在哪里放置List <t>数据行的相关方法?</t>

时间:2009-07-28 12:12:25

标签: c#

前言:阅读this问题。假设我将所有内容都放在Skeet描述的数据结构中。现在我想写一些处理这种数据的方法。这就是我想出的:理想情况下,这类数据应该属于自己的类。所以我决定包装数据点列表。

public class MeteoDataPoint
{
    private readonly DateTime timeStamp;
    public DateTime TimeStamp { get { return timeStamp; } }

    private readonly double temperature;
    public double Temperature { get { return temperature; } }

    private readonly double airPressure;
    public double AirPressure { get { return airPressure; } }

    public MeteoDataPoint(DateTime timeStamp,
                          double temperature,
                          double airPressure)
    {
        this.timeStamp = timeStamp;
        this.temperature = temperature;
        this.airPressure = airPressure;
    }
}

public class MeteoDataPointList
{
    private List<MeteoDataPoint> list;
    public MeteoDataPointList() { list = new List<MeteoDataPoint>(); } 

    // expose some of List's functionality
    public void Add(MeteoDataPoint p) { list.Add(p); }
    public bool Remove(MeteoDataPoint p) { return list.Remove(p); }
    public void RemoveAt(int i) { list.RemoveAt(i); }
    public int Count { get { return list.Count; } }
    public MeteoDataPoint this [int i]  {  get { return list[i];  } }

    // and now I can wrtie my custom methods specific to my data
    public double AverageTemperature()
    {
        double sum=0;
        foreach (MeteoDataPoint m in list) { sum += m.Temperature;  }
        return sum / list.Count;

    }
}
你怎么看?我该如何改进呢?有没有更好的方法(可能是子类化List或只是一个带静态方法的类来操作MeteoDataPoint列表)?我应该关心一个析构函数吗?

注意:对不起,如果这个问题太简单了,我一直在用csharp乱涂乱画,但这是我第一次创建有用的东西,并且因为语言提供了很多方法来实现同样的目的。任务我经常发现自己处在十字路口,想知道哪条路是最好的。

3 个答案:

答案 0 :(得分:2)

只要您需要它们的列表,就可以使用MeteoDataPoint的通用列表。泛型可以在System.Collections.Generic中找到。您可以找到有关通用列表here的信息。

var list = new List<MeteoDataPoint>();

要添加其他方法,我会使用扩展名。

public static class MeteoDataPointExtensions
{
     // not really much point to this extension, but it demonstrates the idea
     public static double AverageTemp( this IEnumerable<MeteoDataPoint> items )
     {
         return items.Average( l => l.Temperature ); 
     }
}

已更新以使用IEnumerable而不是list来使其更适用于不同类型的集合。

答案 1 :(得分:2)

是的,我认为你想要继承List:

public class MeteoDataPointList : List<MeteoDataPoint>
{
    public MeteoDataPointList() { } 

    // and now I can wrtie my custom methods specific to my data
    public double AverageTemperature()
    {
        double sum=0;
        foreach (MeteoDataPoint m in this) { sum += m.Temperature;  }
        return sum / this.Count;
    }
}

无需担心析构函数。对于C#,您将考虑实现IDisposable,但这对于处理非托管资源的清理(在这种情况下您没有)是非常必要的。

此外,已有一种平均功能的扩展方法,因此您可以在技术上使用:

List<MeteoDataPoint> list

并且做:

double avg = list.Average(point => point.Temperature);

了解Extension MethodsFunc <{3}}也很了解

答案 2 :(得分:1)

我真的很困惑于MeteoDataPointList服用什么......?

不;除非处理非托管对象,否则不需要析构函数/终结器。

例如,将Collection<T>(或者List<T>)子类化为扩展它会简单得多:

public sealed class MeteoDataPointList : Collection<MeteoDataPoint>
{
    // additional methods only, such as AverageTemperature
}

请注意,在C#3.0中,您也可以通过扩展方法执行此操作,它可以在任何公共集合/ MeteoDataPoint s序列中使用。

public static class MeteoExtension {
    public double AverageTemperature(this IEnumerable<MeteoDataPoint> items)
    {
        // or just return items.Average(m=>m.Temperature);  ;-p
        double sum=0;
        int count = 0;
        foreach (MeteoDataPoint m in items) { sum += m.Temperature; count++; }
        return sum / count;
    }
}