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