Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# c linq将三个列表连接到嵌套字典_C#_Linq_Dictionary - Fatal编程技术网

C# c linq将三个列表连接到嵌套字典

C# c linq将三个列表连接到嵌套字典,c#,linq,dictionary,C#,Linq,Dictionary,我有以下几点: public class product { public string ID {get;set;} public string Code { get; set; } } public class subProduct { public string Code { get; set; } public string productID { get; set; } }

我有以下几点:

    public class product
    {
        public string ID {get;set;}
        public string Code { get; set; }
    }

    public class subProduct
    {
        public string Code { get; set; }
        public string productID { get; set; }
    }

    public class AddValueForSubProduct
    {
        public string subProductCode { get; set; }
        public string AddValue { get; set; }
    }
   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
我想从这些收藏中获取词典:

       List<product> products = GetProducts();
       List<subProduct> subProducts = GetSubProducts() ;
       List<AddValueForSubProduct> vForSubProd = GetAddValueForSubProduct();
   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
其中:

   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
我试过了,但我收到了关于字典中重复键的异常

   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
 var res = from p in products 
                      join sb in subProducts on p.ID equals sb.productID into sbs
                      from c in sbs
                      join vF in vForSubProd on c.code equals vF.subProductCode into addingData
                      select new KeyValuePair<string, Dictionary<string, string>>(p.code, addingData.
                      ToDictionary(v => v.subProductCode, v => v.AddValue));

与其在一个查询中尝试连接数据并将连接结果映射到字典,不如只创建代码和子代码到相关列表的查找

   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
创建查找非常简单:

   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
var subProductLookup = subProducts.ToLookup(sub => sub.Code);
var valueLookup = vForSubProd.ToLookup(value => value.subProductCode);
通过这些查找,您现在可以在ToDictionary调用中将每个产品映射到该代码的子产品列表,还可以将每个子产品映射到所有值中。这里需要注意的是,从技术上讲,每个子产品可能有多个值,因此您需要选择一个,例如第一个,或者更改最内部的字典以查找值的集合,而不是单个值

   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
var dictionary = products.ToDictionary(
    product => product.Code,
    product => subProductLookup[product.Code]
        .ToDictionary(
            sub => sub.Code,
            sub => valueLookup[sub.Code].First().AddValue));

与其在一个查询中尝试连接数据并将连接结果映射到字典,不如只创建代码和子代码到相关列表的查找

   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
创建查找非常简单:

   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
var subProductLookup = subProducts.ToLookup(sub => sub.Code);
var valueLookup = vForSubProd.ToLookup(value => value.subProductCode);
通过这些查找,您现在可以在ToDictionary调用中将每个产品映射到该代码的子产品列表,还可以将每个子产品映射到所有值中。这里需要注意的是,从技术上讲,每个子产品可能有多个值,因此您需要选择一个,例如第一个,或者更改最内部的字典以查找值的集合,而不是单个值

   Dictionary<string*, Dictionary<string**,string***>>  
                 *   product.Code
                 **  subProduct.Code
                 *** AddValueForSubProduct.AddValue
var dictionary = products.ToDictionary(
    product => product.Code,
    product => subProductLookup[product.Code]
        .ToDictionary(
            sub => sub.Code,
            sub => valueLookup[sub.Code].First().AddValue));