0

私は c# MVC3 の新しい開発者です。オブジェクト内にプロパティの配列を含むオブジェクトを作成できないという問題があります。

たとえば、10 個の配列に対してインスタンス ABC.Property[] を作成したいとします。

ABC.プロパティ[0]

ABC.プロパティ[1]

ABC.Property[2] ..... .... ABC.Property[10]

デバッグ モードを使用して確認したところ、ABC.Property[] が null であることがわかりました。そのため、そのオブジェクトの配列に値を追加することはできません。

プロパティの配列でオブジェクトをクレートする方法は?

ありがとうございました。

namespace finance3.Models
{
public class Expected_and_Risk
{


    public decimal[] Prop { get; set; }
    public decimal[] Forecast { get; set; }
    public string[] Name { get; set; }
    public decimal[] AxB { get; set; }
    public decimal[] PowAxB { get; set; }


    public decimal  ExpectValue(Expected_and_Risk abc)
    {

        decimal count = abc.Forecast.Count();

        Expected_and_Risk Result = new Expected_and_Risk();

        for (int i = 0 ; i < count ; i++)
        {
            // here is the problem
            // i cannot add new data to array because it has no dimemsion and i tried this
            //
            // Expected_and_Risk[] Result = new Expected_and_Risk[10];
            //
            // but it didn't work

            Result.Name[i] = abc.Name[i];
            Result.Prop[i] = abc.Prop[i];
            Result.Forecast[i] = abc.Forecast[i];
            Result.AxB[i] = abc.Prop[i] * abc.Forecast[i];


            decimal a = Result.AxB[i];
            decimal sumAxB =+ a;

            double temp = (double)(a * a) ;
            Result.PowAxB[i] = (decimal)(temp);

        }

        return Convert.ToDecimal(Result); 
    }
}

}
4

3 に答える 3

2

クラスにコンストラクターを追加する必要があり、そのコンストラクターでプロパティのサイズを定義できます

public class Expected_and_Risk
{
//......//your code here
    public Expected_and_Risk()
      {
      this.Prop  = new decimal[10]; // this will define an array of 10 decimal elements for Prop
      }
}

オブジェクト指向プログラミングについてもお読みください。また、この記事「C# でのコンストラクターの紹介」もご覧ください。

于 2012-05-16T05:48:12.690 に答える
2

現時点では、 Expected_and_Riskに配列がありますが、変数を初期化していません。コンストラクター内でこれを行うことができます。

public Expected_and_Risk(int count)
{
    Name = new string[count];
    ...
}

...しかし、それは実際には厄介な設計であることをお勧めします。多数のコレクションがあり、すべて同じ数で、どこにx[0]対応するかy[0]などがある場合は、それらのプロパティのカプセル化を表すカスタム タイプのコレクションを1 つz[0]持つことを検討する必要があります。例えば:

// Must be an int, not a decimal - you can't create an array with a decimal count
int count = abc.Forecast.Count();

// Note: rename type to follow .NET naming conventions
Expected_and_Risk[] results = new Expected_and_Risk[count];
for (int i = 0; i < count; i++)
{
    results[i].Name = abc[i].Name;
    ...
}

...もちろん、今abcも配列になることを除いて。(本当にここですべての値をコピーしようとしているだけなのか、それともビジネス ロジックが含まれているのかは明らかではありません。値をコピーするより良い方法があります。)

または、本当に内にコレクション必要な場合は、配列の代わりに をExpected_and_Risk使用することを検討してください。List<T>そうすれば、事前にカウントを指定する必要はありません。

于 2012-05-16T05:48:54.597 に答える
0

より良い方法は、Expected_and_Riskクラスに次のメソッドを追加し 、コンストラクター内から呼び出すことです。

EDIT- 編集はInitializeをプライベートにし、コンストラクター内で呼び出すために行われます。

void Initialize(int size)
{
    Prop = new decimal[size];
    AxB = new decimal[size];
    Forecast = new decimal[size];
    PowAxB = new decimal[size];
    Name = new string[size];
}

    public Expected_and_Risk(int size)
    {
      ....
      Initialize(size);
    }

その後、ExpectValueで次のように使用します

Expected_and_Risk Result = new Expected_and_Risk(size)// size is 10 in example;
于 2012-05-16T05:56:49.837 に答える