2016-07-27 9 views
-3

平均Linq関数の結果を丸めたいですか?ラウンド平均Linq関数C#

public IEnumerable<GetLocationsAverageDTO> GetLocationsAverageByCompanyId(int id) 
{ 
    try 
    { 
     var baseQuery = _dbContext.Answers.AsNoTracking() 
           .Where(p => p.Location.Company.Id == id 
              && p.Question.Type != QuestionType.Text) 
           .GroupBy(g => new { Location = g.Location.Name }) 
           .Select(x => 
              new GetLocationsAverageDTO 
              { 
               LocationName = x.Key.Location, 
               Average = x.Average(f => f.Numeric) 
              }) 
           .OrderBy(x => x.LocationName); 

     var dto = baseQuery.ToList(); 

     return dto; 
    } 
    catch (Exception error) 
    { 
     _logger.Error("[Error in SurveyService.GetLocationsAverageByCompanyId - id: " + id + " - Error: " + error + "]"); 

     return null; 
    } 
} 

何か

Average = x.Average(f => f.Numeric, 2) // result: 45,21 
+0

にこれはどこから来るのかに関係なく、所望の精度に数値を丸めないで行うことが、より多くのLINQのとはあまりありません。 –

+4

'Math.Round(x.Average(f => f.Numeric)、2);'を使用できません。 – Habib

+0

通常、テキストに書式設定するのではなく、メモリ内の二重小数点を '丸める'要求は間違っています。あなたはこの正確な時点でそれを必要としていますか? –

答えて

1

のようにあなたは、単にあなたのLINQクエリの終わりにしたい小数の桁数を示す第2のパラメータを受け入れMath.Round()関数を適用することができます。

Average = Math.Round(x.Average(f => f.Numeric), 2); 
2

丸めは、SQL-プロバイダに翻訳されている場合、私は本当に知りませんが、メモリ内の繰り返しを行うと、すべてのケースで動作しますMath.Round()使用することができます:ちょうどラップ

var dto = baseQuery.ToList(); 
foreach(var item in dto) 
{ 
    item.Average = Math.Round(item.Average , 2); 
} 
+0

ここに.ToList()を呼び出す理由はありません。 –

+0

@EricJ。結果としていくつかのリストにアイテムを格納する必要があります。それ以外の場合は、ループの最後にアイテムが失われます。 – user3185569

+0

@ user3185569 'ToList'の結果が他の場所に保存されていない限り、それらはとにかく失われています。 – Kyle

0

x.AverageMath.Round

.Select(x => 
new GetLocationsAverageDTO 
{ 
    LocationName = x.Key.Location, 
    Average = Math.Round(x.Average(f => f.Numeric), 2) 
})