【问题标题】:Divding property by property in LINQ expressionLINQ表达式中的属性除以属性
【发布时间】:2017-07-26 07:07:06
【问题描述】:

我写了如下代码:

Session["priceRange"] = ranges.Select(r => new PriceRangeGraph
{
     Price = Math.Round(r, 2),
     Sales = lista.Where(x => ranges.FirstOrDefault(y => y >= x.SalePrice) == r).Sum(x => x.SaleNumber),
     SuccessfulSellers = lista.GroupBy(x => x.StoreName).Where(x => ranges.FirstOrDefault(y => y >= x.Select(z => z.SalePrice).FirstOrDefault()) == r && x.Select(h => h.SaleNumber).FirstOrDefault() > 0).Count(),
     UnSuccessfulSellers = lista.GroupBy(x => x.StoreName).Where(x => ranges.FirstOrDefault(y => y >= x.Select(z => z.SalePrice).FirstOrDefault()) == r && x.Select(h => h.SaleNumber).FirstOrDefault() == 0).Count(),
}).ToList();

它的作用如下:

  • 查找给定范围内的所有销售
  • 查找有多少卖家在给定范围内进行了销售
  • 查找有多少卖家在给定范围内没有进行任何销售

现在我想为有销售和没有销售的卖家获得成功的销售率。我这样做的方法是:

(thoseWhoHadSales/(thoseWhoHadSales+thoseWhoDidnt))*100;

在给定的价格范围内,我会在哪里为卖家获得成功的销售。

现在我感到困惑的是确实/可能发生的异常:

Divide by zero exception... If those who had sales is equal to = 0;

我现在执行上面显示的公式的最简单方法是什么。我可以在 select 语句中以某种方式立即执行此操作吗?

如果在给定价格范围内的销售额 = 0,我只需将销售额设置为 0...

谁能帮帮我?

斯蒂芬,你的意思是这样的:

public double SellThroughRate
{
    get { return SellThroughRate; }
    set
    {
        if (SuccessfulSellers != 0)
        {
            SellThroughRate = Math.Round((SuccessfulSellers / (SuccessfulSellers + UnSuccessfulSellers)) * 100,2);
        }
        else
        {
            SellThroughRate = 0;
        }
    }
}

【问题讨论】:

  • 有人吗? =)
  • 在你的模型中有一个属性来进行计算(仅限 getter)并测试 SuccessfulSellers + UnSuccessfulSellers 是否等于 0 不是更容易吗
  • SellThrough 属性在上面我想要不? =D
  • 不,我只是说只读属性 - public double SellThroughRate { get { return SuccessfulSellers + UnSuccessfulSellers == 0 ? 0 : Math.Round((SuccessfulSellers / (SuccessfulSellers + UnSuccessfulSellers)) * 100, 2); } };
  • 实际上我正在查看您难以阅读的.GroupBy() 子句,我怀疑您可以简化一下。但是我需要睡觉,所以需要等到早上:)

标签: c# asp.net asp.net-mvc linq asp.net-mvc-5


【解决方案1】:

double.IsNaN() 可以替代检查等于零的条件,

double tempResult = Math.Round(((double)SuccessfulSellers / ((double)SuccessfulSellers + (double)UnSuccessfulSellers)) * 100,2);
SellThroughRate = double.IsNaN(tempResult) ? 0 : tempResult;

希望有帮助,

【讨论】:

  • OP 没有显示它,但 .Count() 查询表明 SuccessfulSellersUnSuccessfulSellersint,在这种情况下你需要一个演员 - ...Math.Round(((double)SuccessfulSellers /...
【解决方案2】:

将您的属性设为只读,并有条件地检查SuccessfulSellers + UnSuccessfulSellers 是否为零以防止出现异常。我还建议您按原样存储结果,并使用[DisplayFormat] 属性在视图中显示格式化结果

[DisplayFormat(DataFormatString = "{0:P2}")]
public double SellThroughRate
{
    get
    {
        double total = SuccessfulSellers + UnSuccessfulSeller;
        return total  == 0 ? 0 : SuccessfulSellers / total;
    }
};

【讨论】:

  • 我再次查看了您的查询,因为它看起来有点奇怪。但我看到你已经问过another question :)
  • 是的,顺便说一句。斯蒂芬,事实证明我必须将 SaleNumber 放入 groupby 语句中才能将它放在 where 语句中,例如 x=>x.Key.SaleNumber == 0 或 x.Key.SaleNumber > 0 以便我可以检查谁实际拥有销售和谁没有=D
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多