【问题标题】:Highlight the lowest price突出显示最低价格
【发布时间】:2013-08-09 22:46:38
【问题描述】:

目标

获取并突出显示foreach 中小数点之间的最低价格。

场景

我正在比较一些市场之间的各种产品价格。结果显示在 HTML 的table 中。该表的最后一行包含总价值,即每个市场的每种产品价格的总和。

例如:

                 Market 1    Market 2  
 Xbox 360        US$119,00   US$125,00 
 Playstation 3   US$129,00   US$119,00 
 Total           US$248,00   US$244,00

View后面的代码是:

@foreach (var item in Model.Collection.Products.DistinctBy(p => p.id))
{
    <tr>
        <td>
            <p>@item.name</p>
        </td>

        @foreach (var market in Model.Markets)
        {
            <td>
                @foreach (var product in Model.Collection.Products.Where
                    (p => p.productId == item.productId && 
                     p.marketId == market.id))
                {
                    <p>@product.price</p>
                }
            </td>
        }
    </tr>
}

<tr>
    @foreach (var market in @Model.Markets)
    {
        <td class="total">
            @{
                decimal totalValue = 
                    Model.Collection.GetTotalPrice(market.marketId);
            }

            @if (totalValue == 0)
            {
                <h2>Unavailable</h2>
            }
            else
            {
                <h2>US$@totalValue</h2>
            }
        </td>
    }
</tr>

到目前为止,一切都很好。现在问题来了:我想突出显示市场之间的最低价格(最低总价)——我该怎么做?

【问题讨论】:

  • 你是指最低总价,还是每列/每行最低价?
  • 在您的示例中,我发现产品与市场之间没有关联?另外你需要详细说明“突出最低价”是什么?每个单独的市场?每个产品?
  • @dutch 哦,总价最低。对此感到抱歉。
  • “关联”,在这种情况下是相对的。看看我的更新。

标签: c# asp.net-mvc-4


【解决方案1】:

您可以将最低价格作为基准。此示例在价格的&lt;p&gt; 标签上设置lowest 类,如果它是&lt;= 该特定市场的最低产品价格

@foreach (var market in Model.Markets)
{
    @{ 
        var marketProducts = Model.Collection.Products.Where(p => p.productId == item.productId && p.marketId == market.id).ToList();
        var lowestMarketPrice = marketProducts.Min(p => p.price);
    }
    <td>
        @foreach (var product in marketProducts)
        {
            <p @(product.price <= lowestMarketPrice ? "class=lowest" : "")>@product.price</p>
        }
    </td>
}

根据您的说明,您可以通过以下方式突出显示任何市场中最低的总数

@{ 
    var marketTotals = Model.Markets.ToDictionary(m => m.marketId, m => Model.Collection.GetTotalPrice(m.marketId));
    var lowestTotal = marketTotals.Min(t => t.Value);
}
@foreach (var price in marketTotals)
{
    <td @(price.Value <= lowestTotal ? "class=total-lowest" : "class=total")>
        <h2>@{ price.Value == 0 ? "Unavailable" : String.Format("US${0}", price.Value) }</h2>
    </td>
}

【讨论】:

  • 这有意义吗?我问这个是因为一种产品可能更贵,但另一种可能更便宜——我认为你的逻辑基于这种哲学是不正确的。为了更好地理解此评论,请查看我的上次更新——我更改了示例以更好地说明。
  • @GuilhermeOderdenge 由您来决定哪种逻辑最有效,我根据您想要突出显示“每个市场的最低价格”这一事实来回答您的问题我相信这段代码可以做到。
  • @GuilhermeOderdenge 您要求以最低价格突出显示
  • 我问的不是“每个市场的最低价格”,而是“市场之间的最低价格(最低总价)” i>.
  • @GuilhermeOderdenge 好吧,公平地说,您的问题并不是很清楚。好的,那么您正在寻找所有市场中所有产品中总和最低的?
【解决方案2】:

在渲染输出之前计算最低价格:

@{
var products = Model.Collection.Products.DistinctBy(p => p.id);
decimal[] minimalPrices = new decimal[products.Length];
@for(int i = 0; i < products.Length; i++))
{
  decimal min = Decimal.MaxValue;
  @foreach (var market in Model.Markets)
  {
    //..compute price and compare to min        
  }
  minimalPrices[i] = min;
}
}

..... 在渲染中

if( price == minimalPrices[i])
   highlight it

【讨论】:

  • 你好,@qub1n!你明白我的问题了,呵呵。顺便说一句,var products 没有 Length 属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2021-12-17
  • 1970-01-01
相关资源
最近更新 更多