[英]Inheriting a List<> in c# and overriding the constructor
我正在尝试围绕List创建一个包装器,以执行一些我想做的特定事情,例如计算最大最小值,从某些元素中提取特定值等。
我开始
public struct datum {
public UInt32[] chan;
public UInt64 sample_number;
public UInt32 time;
public UInt32 source_sector;
}
public class dataSet : List<datum> {
bool dirty=true;
....
}
这些方法通常是这样的(我想知道列表是否已被修改,因为我有一个max()/ min()函数,该函数仅在数据被修改后才解析数据,并在列表没有被缓存时缓存值以供重用已修改)
public new void Add(datum x ) {
base.Add(x);
this.dirty = true;
}
但是,我不确定如何创建构造函数。 此语法不起作用..如何获得这种类型的行为?
public dataSet(int count) {
this = (dataSet) new List<datum>(count);
}
我也有这个构造函数,尽管未经测试,它似乎可以正常工作(没有编译错误)
public dataSet(List<datum> data) {
this.AddRange(data);
}
我碰到过一篇帖子,说您应该使用Collection,而List是为了提高速度。 尽管我需要速度,但是我不确定为什么Collection会更好?
-更新-
我不想使用linq,因为您无法创建可以同时高效地计算max / min的东西:
public void recalculateMaxMin() {
foreach (var d in data) {
for (int i = 0; i < 16; i++) {
if (d.chan[i] > max[i]) max[i] = d.chan[i];
if (d.chan[i] < min[i]) min[i] = d.chan[i];
}
}
}
n
我正在尝试围绕List创建一个包装器,以执行一些我想做的特定事情,例如计算最大最小值,从某些元素中提取特定值等。
别。 只需使用LINQ to Objects。 那就是它的设计目的 :
var list = new List<int> { 10, 20, 30 };
var average = list.Average();
var max = list.Max();
// etc
通常,我建议无论如何不要从List<T>
派生-这不是它的设计目的。 但是,如果必须的话,只需将一个构造函数链接到一个基本构造函数即可:
public dataSet(int count) : base(count)
{
// Add in any extra code you want to here. Probably none in this case.
// It would execute *after* the base constructor call.
}
有关构造函数链接的更多信息,请参见我关于构造函数的文章 。
(我也强烈建议您更改名称dataSet
不符合.NET命名约定,而DataSet
对大多数.NET开发人员而言完全意味着其他 。)
您永远都无法在C#中将"this"
设置为某些内容。 我认为您正在寻找:
public dataSet(int count)
: base(count)
{ }
但是,我认为您应该看看"System.Linq"
命名空间。 我认为您要实施的工作已经由Microsoft完成。 Linq中已经实现了“选择”,“加入”,“位置”和许多其他子句。 您也可以使用"INotifyCollectionChanged"
接口实现脏东西。
以下是一些参考:
如果您确实需要实现具有新行为的完整List类,则实现"System.Collections.Generic.IList"
接口是唯一可以使您的想法更高级,更完美的方法。 它比从List类继承并尝试更改您无权访问的所有内容更具可定制性。
希望能帮助到你
干杯
public dataSet(int count)
: base(count) {
}
您可以使用base()
调用基本类型的构造函数
public dataSet(int count) : base(count)
{
// no need to implement anything here. base(count) will call the base
// type's constructor
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.