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

.NET Core中修复内部foreach循环后无法正确返回列表的问题

问题分析与修复方案

核心问题

  1. 重复生成ViewModel:遍历filteredEvents的循环中,每添加一个individual到filteredIndividuals,就会遍历整个filteredIndividuals重新生成所有已处理过的individual的ViewModel,导致individualList中出现大量重复数据,还会造成不必要的性能损耗。
  2. return语句位置错误:如果把return individualList;放到individualList.Add(viewModel);附近,方法会在第一次生成ViewModel后立即返回,自然只能得到单个元素。

修复后的代码

string profilePictureUrl;

public List<MapIndividualsViewModel> GetValidMapIndividuals(ProjectRef projectRef)
{
    var individualList = new List<MapIndividualsViewModel>();
    Preference preference = _preferenceServiceResolver.GetPreference(projectRef);

    var places = _placeService.GetPlaces(projectRef);
    var filteredPlaces = places.Select(p => new
    {
        Id = p.Id,
        Lat = p.Lat,
        Lng = p.Lng
    }).ToArray();

    // 用LINQ简化事件收集,替代嵌套循环
    var eventsList = filteredPlaces
        .SelectMany(place => _eventService.GetByPlace(projectRef, place.Id))
        .ToList();

    // 过滤并提取事件所需属性
    var filteredEvents = eventsList
        .Where(e => e.Name == "BIRTH" || e.Name == "DEATH")
        .Select(e => new
        {
            Name = e.Name,
            Date = e.Date,
            ReferenceId = e.ReferenceId
        })
        .ToList();

    foreach (var evt in filteredEvents)
    {
        var individual = _individualServicev2.Get(projectRef, evt.ReferenceId);
        dynamic links = JsonConvert.DeserializeObject(individual.Links);
        int profilePictureId = links.ProfilePictureId;
        profilePictureUrl = _multimediaServicev2.GetPrimaryUrl(projectRef, profilePictureId);

        // 直接基于当前individual生成ViewModel,无需遍历历史列表
        var viewModel = new MapIndividualsViewModel
        {
            Id = individual.Id,
            DisplayName = individual.FullName,
            Gender = individual.Gender,
            AliveStatus = individual.AliveStatus,
            ProfileImageUrl = profilePictureUrl,
            BirthDate = filteredEvents.FirstOrDefault(e => e.ReferenceId == individual.Id && e.Name == "BIRTH")?.Date,
            DeathDate = filteredEvents.FirstOrDefault(e => e.ReferenceId == individual.Id && e.Name == "DEATH")?.Date,
            Latitude = filteredPlaces.FirstOrDefault(p => p.Id == individual.Id)?.Lat ?? 0,
            Longitude = filteredPlaces.FirstOrDefault(p => p.Id == individual.Id)?.Lng ?? 0,
        };
        individualList.Add(viewModel);
    }

    // 所有数据处理完成后返回完整列表
    return individualList;
}

额外优化说明

  • 用SelectMany简化事件收集的嵌套循环,代码更简洁高效。
  • 移除了无用的filteredIndividuals列表,直接使用当前循环中的individual对象,减少内存占用和冗余逻辑。

内容的提问来源于stack exchange,提问作者Sandanuwan Dharmarathna

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 22:24:56