5

目標

List<T>C#内の各製品の最終価格を計算します。

問題

単純な製品を計算price * quantityし、結果をビューに返す必要があります。

この構文を見てください:

var productPrice = productsPrices.Find(x => x.productId == 1); 
productPrice.finalProductPrice = 
    (productPrice.promotionalProductPrice != 0 ? 
        productPrice.promotionalProductPrice : 
        productPrice.originalProductPrice) 
    * sessionProducts.Find(x => x.id == 1).quantity;

上記で渡されたコード フラグメントの直前に、製品の ID を格納する文字列があります。以下を参照してください。

string ids = string.Join(", ", sessionProducts.Select(x => x.id));

finalProductPriceそして、リストの各製品に値を設定する必要があると思いますがproductsPrices、これをどのように実行できるかわかりません。

この件について私が思ったこと:

私は次のようなものを使用できると考えていました:

productsPrices.Find(x => x.productId == productsPrices.Contains(ids))
    .finalProductPrice = 
    (productsPrices.Find(x => productsPrices.Contains(ids))
        .promotionalProductPrice != 0 ?
    productsPrices.Find(x => productsPrices.Contains(ids))
        .promotionalProductPrice : 
    productsPrices.Find(x => productsPrices.Contains(ids))
        .originalProductPrice) *
    sessionProducts.Find(x => x.id == 1).quantity;

しかしもちろん、成功.Contains()はありません — 文字列では機能しません。

の本当の質問

リストにfinalProductPrice含まれる各製品の権限を定義するにはどうすればよいですか? productsPrices内の各 ID を に渡すにはどうすればよいstring ids [...]ですx.productId == somethingか?

ヒントを歓迎します (例:を使用しないで、代わり.Find()に使用してください!).Select()

スポットライト コード

ActionResult私のビューに必要なすべての情報を送信する私に従ってください:

比較.cs :

public ActionResult Compare()
{
    List<getMarkets_Result> markets = Markets.Build();

    SessionStore sessionStore = new SessionStore();
    List<getSpecificProductToShoppingList_Result> sessionProducts = 
        sessionStore.Get("ProductsSummary", "generic");

    string ids = string.Join(", ", sessionProducts.Select(x => x.id));
    List<getProductsPrices_Result> productsPrices = Products.PricesList(ids);

    ListComparisonViewModel listComparisonViewModel = 
       new ListComparisonViewModel
    {
        Markets = markets,
        SessionProducts = sessionStore.Get("ProductsSummary", "generic"),
        ProductsPrices = productsPrices
    };

    return View(listComparisonViewModel);
}

productsPrice必要に応じて、リストのコンテキスト:

public partial class getProductsPrices_Result
{
    public decimal originalProductPrice { get; set; }
    public decimal promotionalProductPrice { get; set; }
    public decimal finalProductPrice { get; set; }
    public string productName { get; set; }
    public string marketName { get; set; }
    public int productId { get; set; }
    public int marketId { get; set; }
}

そして、 Products(.cs)というモデルを作成して、製品の背後にあるロジックを実行しました。このモデルが持つ最初の (そして単一の) メソッドは次のCalculateFinalPrice()とおりです。

public decimal CalculateProductPriceByQuantity(decimal price, int quantity)
{
    return price * quantity;
}
4

4 に答える 4

1

ビジネス上の問題を解決しやすくする方法でデータを表すモデルを作成することは、より簡潔にする必要があると思います。つまり、コードを機能させてソリューションを解決します。

まず、製品は数量を認識すべきではありません。これがカートのように機能すると仮定すると、製品はそれ自体についてのみ知っているはずです。したがって、の実装はfinalProductPriceはるかに簡単になるはずです:

public decimal finalProductPrice 
{
    get 
    {
        return (promotionalProductPrice != 0 ? 
            promotionalProductPrice : 
            originalProductPrice);
    }
}

製品を扱うときは、クラスを作成し、その中にクラスを含めて、品質と合計価格を計算します。

public class ProductCollection
{
    public IEnumerable<getProductsPrices_Result> Products { get; set; }
    public int Quantity { get { return Products.Count; } }
    public decimal TotalPrice 
    {
        get
        {
            return Products.Sum(p => p.finalProductPrice );
        }
    }
    public ProductCollection(IEnumerable<getProductsPrices_Result> products)
    {
        this.Products = products;
    }
}

ビューモデルは次のようになります。

ListComparisonViewModel
{
    Markets = markets,
    Products = new ProductCollection(sessionStore.Get("ProductsSummary", "generic"))
};

ここで注意したい重要な点は、これがセッション アクセスの表面積を減らすのに役立つということです。セッションは「誰でもアクセス」できるため、不可解になり、多くの問題を引き起こす可能性があります。ほとんどすべてのシナリオで、セッション cookie jar 内のハンド数が少ないほど良い結果が得られます。(より少ないキー、およびより少ないクラス タイプとインスタンス)

于 2013-08-05T20:32:40.417 に答える