簡體   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