1

Listのラッパーを作成して、max minの計算、一部の要素からの特定の値の抽出など、特定の処理を実行しようとしています。

私は

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

コレクションを使用する必要があり、速度を上げるためにリストを使用するという投稿に出くわしました。スピードが必要ですが、なぜコレクションが優れているのかわかりません。

- アップデート -

これほど効率的に最大/最小を同時に計算するものを作成できないため、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

4

4 に答える 4

7

Listのラッパーを作成して、max minの計算、一部の要素からの特定の値の抽出など、特定の処理を実行しようとしています。

しないでください。LINQtoObjectsを使用するだけです。それが設計されたものです:

var list = new List<int> { 10, 20, 30 };
var average = list.Average();
var max = list.Max();
// etc

一般的に、私はとにかく派生することはList<T>お勧めしません-それはそれが設計されたものではありません。ただし、必要な場合は、1つのコンストラクターから基本コンストラクターにチェーンするだけです。

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. Linq

本当に新しい動作で完全なListクラスを実装する必要がある場合"System.Collections.Generic.IList"は、インターフェイスを実装することが、高度で完璧な方法でアイデアを揺るがす唯一のものです。Listクラスから継承して、アクセスできないすべてのものを変更しようとするよりもカスタマイズ可能です。

それが役に立てば幸い

乾杯

于 2012-11-11T20:51:04.420 に答える
1
public dataSet(int count) 
    : base(count)  {
}
于 2012-11-11T20:50:04.110 に答える
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 に答える