You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:48:58