繁体   English   中英

在C#中继承List <>并重写构造函数

[英]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"接口实现脏东西。

以下是一些参考:

  1. INotifyCollectionChanged
  2. 林克

如果您确实需要实现具有新行为的完整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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM