如何实现以产品名为键、所属机架列表为值的C#字典?
问题:构建产品到所属机架集合的字典
类定义
public class Rack { public string Name {get;set;} public List<Product> Products {get;set;} } public class Product { public string Name {get;set;} public string Description {get;set;} }
现有代码及问题
获取机架列表allRacks后,尝试用以下代码构建字典(以产品名为键,对应机架名为值):
var allRacks = GetAllRacks(); // List of racks var dict = allRacks .SelectMany(rack => rack.Products.Select(prod => new { key = prod.Name, value = rack.Name, }) ).ToDictionary(x => x.key, x => x.value);
运行时报错键已存在,原因是同一个产品会出现在多个机架中,ToDictionary要求键唯一,无法直接处理重复键的情况。
示例数据与期望输出
示例数据
Rack Product R1 P1,P2,P3 R2 P3,P4 R3 P2,P4
期望输出字典
P1 → [R1] P2 → [R1, R3] P3 → [R1] P4 → [R2, R3]
解决方案
使用GroupBy先按产品名称分组,再将分组结果转换为字典,值为对应所有机架名称的集合:
var allRacks = GetAllRacks(); var productToRacksDict = allRacks .SelectMany(rack => rack.Products.Select(prod => new { ProductName = prod.Name, RackName = rack.Name })) .GroupBy(item => item.ProductName) .ToDictionary( group => group.Key, group => group.Select(item => item.RackName).ToList() // 可根据需求换成IEnumerable<string>或其他集合类型 );
代码说明
SelectMany:将每个机架下的产品展开为「产品名-机架名」的配对项,得到所有产品的分布记录。GroupBy:按产品名对配对项分组,同一个产品的所有机架名会被归到同一组。ToDictionary:将分组转换为字典,键是产品名,值是该组下所有机架名的集合(这里用ToList()转为List,也可保留为IEnumerable<string>)。
内容的提问来源于stack exchange,提问作者CoreLean
相关产品推荐
相关产品推荐

