1

我正在尝试围绕 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];
            }
        }
    }

谢谢

4

4 回答 4

7

我正在尝试围绕 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 命名约定,并且对大多数 .NET 开发人员DataSet来说意味着完全不同的东西。)

于 2012-11-11T20:51:23.090 回答
2

你永远不能"this"在 C# 中设置一些东西。我想你正在寻找这个:

public dataSet(int count)
     : base(count)
{ }

但是在我看来,你应该看看"System.Linq"命名空间。我认为你试图实现的东西已经由微软完成了。'Select'、'Join'、'Where' 和许多其他子句已经在 Linq 中实现。您也可以使用"INotifyCollectionChanged"接口来实现脏东西。

以下是一些参考资料:

  1. INotifyCollectionChanged
  2. 林克

如果您真的需要实现一个具有新行为的完整 List 类,那么实现"System.Collections.Generic.IList"接口是唯一能以先进和完美的方式震撼您的想法的方法。它比从 List 类继承并尝试更改您无权访问的所有内容更具可定制性。

希望能帮助到你

干杯

于 2012-11-11T20:51:04.420 回答
1

您可以使用调用基类型的构造函数base()

public dataSet(int count) : base(count) 
{  
    // no need to implement anything here. base(count) will call the base
    // type's constructor
}
于 2012-11-11T20:51:16.160 回答
1
public dataSet(int count) 
    : base(count)  {
}
于 2012-11-11T20:50:04.110 回答