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

时间:2014-10-03 15:11:31

标签: 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 AddValueForSubProduct
    {
        public string subProductCode { get; set; }
        public string AddValue { get; set; }
    }

我希望从这个系列获得Dictionary<string*, Dictionary<string**,string***>>

       List<product> products = GetProducts();
       List<subProduct> subProducts = GetSubProducts() ;
       List<AddValueForSubProduct> vForSubProd = GetAddValueForSubProduct();

其中:

   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));

1 个答案:

答案 0 :(得分:4)

不是尝试在查询中加入数据并将联接结果映射到字典中,而是更容易创建代码和子代码查找到相关列表。

创建查找非常简单:

var subProductLookup = subProducts.ToLookup(sub => sub.Code);
var valueLookup = vForSubProd.ToLookup(value => value.subProductCode);

通过这些查找,您现在可以在ToDictionary调用中将每个产品映射到该代码的子产品列表,并将每个子产品映射到所有值。值得注意的是,技术上每个子产品可能有多个值,因此您需要选择一个(例如第一个)或更改最内层字典以查找值集合,而不是单个值

var dictionary = products.ToDictionary(
    product => product.Code,
    product => subProductLookup[product.Code]
        .ToDictionary(
            sub => sub.Code,
            sub => valueLookup[sub.Code].First().AddValue));
相关问题