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

如何实现以产品名为键、所属机架列表为值的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>或其他集合类型
    );

代码说明

  1. SelectMany:将每个机架下的产品展开为「产品名-机架名」的配对项,得到所有产品的分布记录。
  2. GroupBy:按产品名对配对项分组,同一个产品的所有机架名会被归到同一组。
  3. ToDictionary:将分组转换为字典,键是产品名,值是该组下所有机架名的集合(这里用ToList()转为List,也可保留为IEnumerable<string>)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 21:23:09