2

私は JSON 文字列を作成しています。行セクションには、作成してヘルパー関数によって計算される JSON 文字列に渡したい 2 つの値があります。このヘルパー関数を 1 回呼び出して、値の配列 (私の場合は 2 つ) を返す方法があるかどうか疑問に思っているので、ヘルパー関数を 2 回呼び出す必要はありません (データベースに 2 回アクセスするのを避けます)。

サンプルコード

            rows = (
                from tempItem in pagedQuery.ToList()
                select new
                {
                    cell = new string[] {                    
                        tempItem.Name,
                        tempItem.Regular,
                        HelperFunction.GetPrice(tempItem.ID, false).ToString(),
                        tempItem.Premium,
                        HelperFunction.GetPrice(tempItem.ID, true).ToString(),
                    }
                }).ToArray()

関数の例:

public decimal GetPrice(int ID, bool Premium)
{
  Item item = databaseCallToGetPrice(ID).first();

  if (Premium)
      return item.ExamplePrice;
  else
      return item.PremiumExamplePrice;
}

だから私が求めているのは、私の例ではヘルパー関数を2回呼び出すことです。それを1回だけ呼び出してから、何とか永続化してから2回使用できる配列を返す方法はありますか?

4

2 に答える 2

2

LetAFAIKを使用できます

rows = (
                from tempItem in pagedQuery.ToList()
                let prices = HelpererFunction.GetPrice(tempItem.ID)
                select new
                {
                    cell = new string[] {                    
                        tempItem.Name,
                        tempItem.Regular,
                        prices[0].ToString() ,
                        tempItem.Premium,
                        prices[1].ToString() ,
                    }
                }).ToArray()

GetPrice 関数をリファクタリングして decimal[] を返すことができます

public decimal[] GetPrice(int ID)
{
  Item item = databaseCallToGetPrice(ID).first();

  return new [] {item.ExamplePrice, item.PremiumExamplePrice};
}
于 2012-10-17T15:49:19.080 に答える
2

Tuple<decimal, decimal>関数からa を返します。

public Tuple<decimal, decimal> GetPrices(int ID)
{
    Item item = databaseCallToGetPrice(ID).First();
    return Tuple.Create(item.ExamplePrice, item.PremiumExamplePrice);
}

次に、それを使用します:

rows = (
        from tempItem in pagedQuery.ToList()
        let prices = HelpererFunction.GetPrices(tempItem.ID)
        select new
        {
            cell = new string[] {                    
                tempItem.Name,
                tempItem.Regular,
                prices.Item1.ToString(),
                tempItem.Premium,
                prices.Item2.ToString(),
            }
        }).ToArray()

IMHOタプルは、関数から2つだけのアイテムを返すことが保証されているため、単純な配列よりも優れています。


さらに明確にしたい場合は、構造体を作成できます

public struct Prices
{
    public decimal PremiumPrice, Price;       

    public Prices(decimal premium, decimal price)
    {
        PremiumPrice = premium;
        Price = price;
    } 
}

次に、ヘルパー関数からそれを返します

public Prices GetPrices(int ID)
{
    Item item = databaseCallToGetPrice(ID).First();
    return new Prices(item.PremiumExamplePrice, item.ExamplePrice);
}

そしてそれを使用します:

rows = (
        from tempItem in pagedQuery.ToList()
        let prices = HelpererFunction.GetPrices(tempItem.ID)
        select new
        {
            cell = new string[] {                    
                tempItem.Name,
                tempItem.Regular,
                prices.Price.ToString(),
                tempItem.Premium,
                prices.PremiumPrice.ToString(),
            }
        }).ToArray()
于 2012-10-17T15:51:10.760 に答える