前言:阅读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乱涂乱画,但这是我第一次创建有用的东西,并且因为语言提供了很多方法来实现同样的目的。任务我经常发现自己处在十字路口,想知道哪条路是最好的。
答案 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 Methods和Func <{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;
}
}