.NET Core中修复内部foreach循环后无法正确返回列表的问题
问题分析与修复方案
核心问题
- 重复生成ViewModel:遍历
filteredEvents的循环中,每添加一个individual到filteredIndividuals,就会遍历整个filteredIndividuals重新生成所有已处理过的individual的ViewModel,导致individualList中出现大量重复数据,还会造成不必要的性能损耗。 - 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
相关产品推荐
相关产品推荐

