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

在C#中能否基于另一个列表实现GroupBy分组?

按国家对City分组的实现方案

当然可以实现,核心是先建立城市ID与所属国家ID的关联映射,再基于这个映射完成分组。

实现代码(支持一个城市归属多个国家的场景)

首先构建城市到国家的查找表,方便快速关联:

// 把每个国家的城市ID拆分为(国家ID,城市ID)的键值对,再构建查找表
var cityToCountries = countries
    .SelectMany(country => country.CityIds.Select(cityId => new { CountryId = country.Id, CityId = cityId }))
    .ToLookup(pair => pair.CityId, pair => pair.CountryId);

接着基于查找表对城市列表分组:

// 将每个城市关联到所属国家,再按国家ID分组
var citiesGroupedByCountry = cities
    .SelectMany(city => cityToCountries[city.Id].Select(countryId => new { CountryId = countryId, City = city }))
    .GroupBy(item => item.CountryId, item => item.City);

简化版(适用于城市仅归属一个国家的场景)

如果可以确定每个城市只属于一个国家,用字典替代查找表会更高效:

// 构建城市ID到对应国家ID的字典映射
var cityToCountryId = countries
    .SelectMany(country => country.CityIds.Select(cityId => (cityId, country.Id)))
    .ToDictionary(pair => pair.cityId, pair => pair.Id);

// 直接按映射的国家ID分组
var citiesGroupedByCountry = cities.GroupBy(city => cityToCountryId[city.Id]);

说明

  • 第一种方案用ToLookup,能处理一个城市被多个国家关联的情况,分组后同一个城市会出现在对应所有国家的分组里。
  • 第二种方案用Dictionary,要求每个城市ID唯一对应一个国家ID,若存在重复映射会抛出异常,适合数据结构明确的场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 19:20:20