0

さまざまなケーキが入ったリストボックスがあります。各ケーキに価格を設定し、選択したケーキの合計費用をラベルに表示するにはどうすればよいですか?以下は私がこれまでに持っているコードです。

for (int index = 0; index < lstCakes.SelectedItems.Count; index++)
        {
            strCakes += Environment.NewLine + lstCakes.SelectedItems[index].ToString();
        }

double tax = 1.13;
        lblOrdered.Text = "You have ordered: " + strCakes + '\n' + "Total Cost: " + (tax * cakeCost).ToString("C");

次のようなスイッチを使ってみましたが、最後に選択したアイテムのコストしか表示されません。

switch (lstCakes.SelectedIndex)
        {
            case 0:
                if (lstCakes.SelectedIndex == 0)
                {
                    cakeCost = 18;
                }
                break;
            case 1:
                if (lstCakes.SelectedIndex == 1)
                {
                    cakeCost = 25;
                }
                break;
            case 2:
                if (lstCakes.SelectedIndex == 2)
                {
                    cakeCost = 40;
                }
                break;
            case 3:
                if (lstCakes.SelectedIndex == 3)
                {
                    cakeCost = 30;
                }
                break;
        }

任意の提案をいただければ幸いです。

4

2 に答える 2

1

これがデスクトップアプリケーションであると仮定すると、後で変更できるように、価格を構成ファイルに入れたいと思うでしょう。<appSettings>App.configファイルに各ケーキのエントリを 含むブロックを追加し、ConfigurationManager.AppSettings[]コマンドを使用してそれらを取得します。

したがって、これがWindowsフォームアプリの場合は、フォームの読み込み時にアプリの設定に移動し、必要なすべてのケーキの詳細を取得して、リストボックスに各ケーキのエントリを入力できます(http:// msdnを参照)。 .microsoft.com / en-us / library / z38x31c0.aspx)。このようにして、各エントリのテキストを動的に作成できます。各行に価格を含める場合は、行のテキストにハードコーディングする必要があります。(私はそれがあなたが求めているものだと思います...)

最後に1つ。文字列を連結するために+を使用しないでください。C#の文字列は不変です。つまり、文字列自体を変更することはできません(理由は、必要に応じて説明できる他のトピックです)。2つの文字列を「+」で連結するには、C#で3番目の文字列を作成し、最初の2つの文字列で埋める必要があります。これにより、パフォーマンスが低下します。文字列をより効率的に連結するには、StringBuilderオブジェクトとAppend()メソッドのいずれかを使用するかString.Format()、同じように機能するを使用します。


不変の文字列:

コアとなる文字列は文字の配列です。配列のサイズを変更できないのと同様に、文字列のサイズも変更できません。これは、配列がスタックに格納されているためです...スタックは、プログラムを実行するための命令で満たされたメモリの一部であり、すべてが互いに「スタック」されています。スタックメモリは事前に割り当てられており、すべての目的と目的で、スタック上のオブジェクトのメモリフットプリントを動的に変更することはできません。5つのintと5つの空のスペースを含む10のintの配列を持つことができますが、を取得してint[5]に変更することはできませんint[10]。さらに5つのintを追加する場合はint[5]、新しいものをインスタンス化しint[10]て埋める必要があります。同じことが文字列にも当てはまります。

配列のサイズ変更の問題の解決策は、リストとその派生物を使用して処理されます。それらはヒープメモリを使用して機能します。これは、StringBuilderオブジェクトの機能に似ています。スタックメモリとヒープメモリ、およびそれがプログラムの実行方法にどのように影響するかについて詳しく知りたい場合は、 http://www.c-sharpcorner.com/UploadFile/rmcochran/csharp_memory01122006130034PM/csharp_memory.aspxを理解するのに役立つ可能性があります。初心者プログラマーを困惑させる多くの謎を説明できるので、知ることは本当に重要です。質問してくれてうれしいです。

于 2012-10-27T18:08:11.727 に答える
0

ケーキの価格は列挙型で維持できます

enum CakePrices{
ChocCake = 20,
VanillaCake = 50
}

コストを計算します。

int TotalCost;
for (int index = 0; index < lstCakes.SelectedItems.Count; index++)
{
  strCakes += Environment.NewLine + lstCakes.SelectedItems[index].ToString();

  //The name of the List Items should match the names on the enum,for this to work
  TotalCost += (int)Enum.Parse(typeof(CakePrices),
                               lstCakes.SelectedItems[index].ToString() ,
                               false)
}

Console.WriteLine("You have ordered:" + strCakes + '\n' + "Total Cost: " + TotalCost);
于 2012-10-27T18:17:14.677 に答える