Blazor中如何计算每行TemperatureC占总和的百分比?
实现方案说明
你不能直接在WeatherForecast实体的percentage属性里完成计算——因为单个实体对象无法获取所有TemperatureC的总和,这个总和是集合层面的数据,需要在获取到完整的天气预报列表后再进行计算。下面是几种可行的实现方式:
方式一:修改实体类,在数据加载后批量计算百分比
1. 更新WeatherForecast类
把percentage改成可赋值的属性(去掉表达式写法):
public class WeatherForecast { [Key] public int Id { get; set; } public DateTime Date { get; set; } public int TemperatureC { get; set; } public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); public double Percentage { get; set; } // 改为可设置的属性 public string? Summary { get; set; } }
2. 在数据加载时计算总和并赋值
在Blazor组件的初始化方法(或数据服务中),获取完整数据后计算总和,再遍历每个对象设置百分比:
private List<WeatherForecast> forecasts = new(); protected override async Task OnInitializedAsync() { // 假设这是你的数据获取方法 forecasts = await ForecastService.GetForecastAsync(DateTime.Now); // 计算所有TemperatureC的总和 var totalTempC = forecasts.Sum(f => f.TemperatureC); // 遍历赋值,处理总和为0的情况避免除以0报错 foreach (var forecast in forecasts) { forecast.Percentage = totalTempC != 0 ? ((double)forecast.TemperatureC / totalTempC) * 100 : 0; } }
3. 在组件表格中显示
<table class="table"> <thead> <tr> <th>日期</th> <th>温度(℃)</th> <th>温度(℉)</th> <th>占比</th> <th>摘要</th> </tr> </thead> <tbody> @foreach (var forecast in forecasts) { <tr> <td>@forecast.Date.ToShortDateString()</td> <td>@forecast.TemperatureC</td> <td>@forecast.TemperatureF</td> <td>@forecast.Percentage.ToString("F2")%</td> <!-- 保留两位小数 --> <td>@forecast.Summary</td> </tr> } </tbody> </table>
方式二:使用ViewModel包装(不修改原实体类)
如果不想修改WeatherForecast实体,可以创建一个ViewModel来包装数据和计算后的百分比:
public class WeatherForecastViewModel { public WeatherForecast Forecast { get; set; } public double Percentage { get; set; } }
在数据加载时转换为ViewModel:
private List<WeatherForecastViewModel> forecastViewModels = new(); protected override async Task OnInitializedAsync() { var rawForecasts = await ForecastService.GetForecastAsync(DateTime.Now); var totalTempC = rawForecasts.Sum(f => f.TemperatureC); forecastViewModels = rawForecasts.Select(f => new WeatherForecastViewModel { Forecast = f, Percentage = totalTempC != 0 ? ((double)f.TemperatureC / totalTempC) * 100 : 0 }).ToList(); }
组件中遍历ViewModel显示即可。
方式三:直接在组件中计算(仅用于显示)
如果不需要保存百分比数据,只是临时显示,可以直接在组件的表格行中计算:
private List<WeatherForecast> forecasts = new(); private int TotalTempC => forecasts.Sum(f => f.TemperatureC);
表格中对应列:
<td> @(TotalTempC != 0 ? ((double)forecast.TemperatureC / TotalTempC * 100).ToString("F2") : 0)% </td>
内容的提问来源于stack exchange,提问作者gab4bdo
相关产品推荐
相关产品推荐

