在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
相关产品推荐
相关产品推荐

