2017-03-06 48 views
0

我寫象下面這樣的代碼:在LINQ表達Divding地產物業

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; 

什麼是對我來說,現在執行的是我上面所示的公式最簡單的方法。我可以在選擇語句中立即執行嗎?

如果這些誰曾銷售給定的價格區間爲= 0,我只想通過設定賣出爲0 ...

有人能幫助我嗎?

斯蒂芬,你的意思是這樣的:

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

任何人? =) – User987

+2

如果'YourSellers' +'UnSuccessfulSellers'等於'0',那麼在模型中只有calc(僅限getter)並測試一個屬性不是更容易嗎? –

+0

SellThrough屬性高於我不想要的嗎? = D – User987

回答

1

只讀讓你的財產,並有條件地檢查SuccessfulSellers + UnSuccessfulSellers是否爲零以防止發生異常。我也建議你保存結果,並使用[DisplayFormat]屬性在視圖中顯示格式化結果

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

一如既往,best答案提供!!!伴侶你搖滾= D – User987

+1

我再次看着你的查詢,因爲它看起來有點奇怪。但我看到你問過[另一個問題](http://stackoverflow.com/questions/42629365/linq-group不管怎樣,我都會把它放在groupby語句中,以使它在where語句中成爲可能。) –

+0

是的,順便說一句,Stephen,事實證明,我必須將SaleNumber放入groupby語句才能將它放在where語句中像x => x.Key.SaleNumber == 0或x.Key.SaleNumber> 0,以便我可以檢查誰實際上有銷售和誰沒有= D – User987

1

double.IsNaN()可替代的檢查等於零條件,

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

希望幫助,

+0

OP沒有顯示它,但''。Count()'查詢建議'SuccessfulSellers'和'UnSuccessfulSellers'是'int',在這種情況下,你需要一個強制轉換 - '... Math.Round(((double)SuccessfulSellers/...' –