如何使用键作为内部列表中的项目初始化字典?

Posted

技术标签:

【中文标题】如何使用键作为内部列表中的项目初始化字典?【英文标题】:How to initialize a dictionary with keys as items from inner list? 【发布时间】:2021-02-09 22:23:12 【问题描述】:

我被困在字典初始化中,我需要获取字典,其中键是项目内部列表元素,值是这些项目。我很难解释,所以这里举个例子。 有结构

public class Process

    public List<Product> Products  get; set; 


public class Product

    public int Id  get; set; 

还有一些数据:

Process 1
   Product 1
   Product 2

Process 2
   Product 2
   Product 3

最后一个字典应该是这样的:

Dictionary<Product, List<Process>>()

     Product1, List<Process>  Process1 ,
     Product2, List<Process>  Process1, Process2 ,
     Product3, List<Process>  Process2  

所以,不知何故,我需要从每个流程中获取唯一键 (Product.Id),并将值设置为流程,每个产品都包含在其中。

我尝试了一些 linq Select 的产品集合,但它创建了一个 Enumerable,所以我不能将它用作键。而且我没有找到任何描述相同问题的问题。

【问题讨论】:

【参考方案1】:

一个高效的解决方案可能是迭代进程列表一次并创建所需的字典。

var processList = new List<Process>();

var result = new Dictionary<Product, List<Process>>();
var product1 = new Product()  Id = 1 ;
var product2 = new Product()  Id = 2 ;
var product3 = new Product()  Id = 3 ;
processList.Add(new Process()  Products = new List<Product>()  product1, product2  );
processList.Add(new Process()  Products = new List<Product>()  product2, product3  );

foreach(var process in processList)

   foreach(var product in process.Products)
   
       if (!result.ContainsKey(product))
          result.Add(product, new List<Process>());
       result[product].Add(process);
   

输出

 Product1, List<Process>  Process1 ,
 Product2, List<Process>  Process1, Process2 ,
 Product3, List<Process>  Process2  

【讨论】:

感谢您的解决方案!效果很好。一般来说,我只是在寻找一些基于 linq 的代码,但我最初对这个问题的想法是错误的。我在使用实体框架 6 从 db 获取一些数据时收到此错误,并且没有正确设置 ef,所以我总是得到 Quaryable,当我遍历它时,ef 会进行数千次选择并执行它,所以我认为它会更好将所有数据放到 RAM 中并使用它。

以上是关于如何使用键作为内部列表中的项目初始化字典?的主要内容,如果未能解决你的问题,请参考以下文章

如何按列对pyspark中的数据框进行分组并以该列作为键并以记录列表作为其值来获取字典?

使用列表中的项目更改嵌套字典的字典中的值?

在啥情况下我会使用元组作为字典键?

如何使用列表和字典将字符串转换为二进制代码

如何获取字典中的键列表?

如何使用一个键将多个列表值创建到python中的字典中?