2012-11-11 34 views
1

我試圖創建一個圍繞名單的包裝做我想做一些具體的事情,如計算最大最小,從一些元素提取特定值等繼承一個List <>在C#和重寫構造

我開始

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; 
    .... 
    } 

的方法通常是這樣的(我想)知道,如果列表中已被修改,因爲我有一個最大(/分鐘()函數,只有分析數據時,它已被修改並且如果該列表未被修改則緩存該值以供重用)

 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使用爲了速度。雖然我需要速度,但我不確定爲什麼收藏會更好?

--UPDATE--

我不想使用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

回答

2

您永遠無法將"this"設置爲C#中的內容。我認爲你正在尋找這樣的:

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

然而,在我看來,你應該看一看"System.Linq"命名空間。我認爲您之前嘗試實施的是微軟之前完成的。 'Select','加入','Where'以及其他許多子句已經在Linq中實現。你也可以使用"INotifyCollectionChanged"界面來實現骯髒的事情。

這裏有一些參考:

  1. INotifyCollectionChanged
  2. Linq

如果你真的需要實現一個新的行爲的完整列表類,實現"System.Collections.Generic.IList"接口是唯一的東西會以先進和完美的方式來搖動你的想法。它比從List類繼承並試圖改變您無法訪問的所有內容更具可定製性。

希望它可以幫助

乾杯

+0

我沒有能找到任何INotifyCollectionChanged和一個List <>的例子 - 你能指點我一個還是提供一個?這將是一個理想的實現 – reza

+0

親愛的,看看http://msdn.microsoft.com/en-us/library/ms668604.aspx和http://www.codeproject.com/Articles/42536/List- vs-ObservableCollection-vs-INotifyPropertyCha – Rikki

+0

INotifyCollectionChanged是一個名爲「CollectionChanged」的事件的接口。 ObservableCollection 已經實現了該接口。你應該只是簡單地使用它。玩的開心。 ;) – Rikki

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

可以調用使用base()

public dataSet(int count) : base(count) 
{ 
    // no need to implement anything here. base(count) will call the base 
    // type's constructor 
} 
7

我試圖創建一個圍繞名單的包裝做一些具體的事情基本類型的構造我想要計算最大最小值,從某些元素中提取特定值等。

不要。只需使用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. 
} 

見我article on constructors有關構造函數鏈的更多信息。

(我也強烈勸你改名字 - dataSet不符合.NET命名約定,並DataSet將意味着something else entirely大多數.NET開發人員)

+0

這不是一個列表,它是一個列表,因此Max()Average()不適用。 'UInt32 [] chan'的寬度是16,我計算所有其他條目中的每個條目的最大值(即所有條目中索引1的最大值,所有條目中索引2的最大值等)。你不能使用標準的LINQ,而且我已經看過幾個LINQ擴展來允許這種查詢,但是對於我的目的來說它不是速度有效的。 – reza

+0

@reza:如果你使'Datum'工具實現'IComparable ','Max'將適用。 「平均數」更爲痛苦,但您可以輕鬆地爲其編寫自己的擴展方法。哎呀,你可以爲所有這些東西寫出自己的擴展方法 - 迄今爲止你所說的任何東西都表明你確實需要自己的收集類型。 –

+1

主要問題是我將不得不創建一個單獨的最大值和最小值,每個都必須通過數據集進行迭代。我的實現(參見上面)只通過一次來計算兩者。這是我沒有和linq一起去的主要原因。 – reza