【问题标题】: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,所以我不能将它用作键。而且我没有找到任何描述相同问题的问题。

【问题讨论】:

    标签: c# linq dictionary


    【解决方案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 中并使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-14
    • 2014-05-12
    相关资源
    最近更新 更多