我正在尝试在列表周围创建一个包装器来执行我想要的某些特定操作,例如计算最大最小值,从某些元素中提取特定值等。
我从
开始 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()/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);
}
我遇到了一篇文章,说您应该使用一个集合,并且列表用于速度。虽然我需要速度,但我不确定为什么收藏会更好?
- 更新 -
我不想使用linq,因为您无法创建与此相同效率同时计算最大/最小的东西:
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];
}
}
}
thnx
我正在尝试创建一个围绕列表的包装,以执行我想要的一些特定的事情,例如计算最大最小值,从某些元素中提取特定值,等等。
不要。只需将LINQ用于对象即可。这就是设计的:
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开发人员完全意味着其他。)
您永远无法将"this"
设置为C#中的某些东西。我认为您正在寻找:
public dataSet(int count)
: base(count)
{ }
但是,我认为您应该看一下"System.Linq"
名称空间。我认为Microsoft之前已经尝试实现了您要实现的工作。另外,您可以使用"INotifyCollectionChanged"
接口来实现肮脏的事情。
这里有一些参考:
- InotifyCollectionChanged
- linq
如果您确实需要实现具有新行为的完整列表类,则实现"System.Collections.Generic.IList"
接口是唯一以高级和完美的方式震撼您的想法的东西。它比从列表类中继承并试图更改您无法访问的所有内容更可定制。
希望它有帮助
欢呼
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
}