0

3 つのボタンを持つ WindowsForm アプリケーションを作成しました。いずれかのボタンをクリックするc:\data.txtと、データの別の「分析」が読み取られ、実行されます。ボタン 1 は の数値を加算しdata.txt、ボタン 2 は数値を平均し、ボタン 3 は数値を乗算します。

それぞれの下private void button1_Clickに、data.txt からデータを読み取るコード行があります。同じ「ReadLines」コードが 3 つのボタン クリック イベントのそれぞれにあるため、これは効率が悪いように思えます。

一度だけデータを読み取ってから、ボタンに分析を実行させる方法はありますか?

このように、「ReadLines」コードは 1 回だけ使用され、データは何らかの方法でbutton1_Clickイベントと共有されます。

4

4 に答える 4

5

これは難しくありません。読み取った値を保持するフィールドが必要です。このフィールドは、クラス内のすべての関数で使用できます。

 private string[] data;

 // in constructor:
 data = File.ReadAllLines(@"c:\data.txt");

 // in your methods, simply use data

もう 1 つのオプションは、かLoadDataどうかをチェックし、メソッドから呼び出すメソッドを用意することです。datanull

private void LoadData()
{
  if(data == null)
    data = File.ReadAllLines(@"c:\data.txt");
}
于 2012-09-12T15:28:31.000 に答える
2

効率をさらに最大化したい場合は、フィールドとプロパティを使用して遅延ロードすることができます。

private string[] _data;

private string[] Data
{
    get
    {
        return _data ?? _data = File.ReadAllLines(@"c:\data.txt");
    }
}

これで、呼び出し元のコードは、フィールドが null であるかどうかを確認する必要なく、プロパティを使用するだけで済み、必要になるまでデータをロードしません。

于 2012-09-12T15:34:43.190 に答える
1

クラスに、遅延読み込みを実行するプロパティを追加します。

最初にデータを保存する場所を追加します

private string[] _FileData;

次に、新しいプロパティを追加します

private string[] FileData 
{ 
    get
    {
        if (_FileData != null && _FileData.Length > 0)
            return _FileData;

        _FileData = File.ReadAllLines(@"c:\data.txt");

        return _FileData;
    }
}

次に、FileData プロパティを使用してファイル テキストを取得します。初めてファイルテキストを取得するだけで、その後は_FileDataファイルを保持し、にアクセスしたときに返されますFileData

于 2012-09-12T15:30:07.243 に答える
1

これも同様に一般的な答えです;)

string各ボタン クリック ハンドラで、空か null ( ) かをチェックする共有変数 (たとえば a ) を宣言できますString.IsNullOrEmpty(myString)。空の場合は、ReadLinesコードを実行してデータをstring変数に保存します。次に、変数に対して処理を行います。

次にボタンをクリックするとstring、ファイルが空ではないことがわかり、ファイルを再度読み取る必要はなく、文字列を処理するだけです。

于 2012-09-12T15:30:32.387 に答える