2011-05-03 123 views
1

我一直在试图将下面的foreach语句转换为LINQ语句,但似乎无法将其包围。任何帮助将受到欢迎。IDictionary <string,IDictionary <string,ICollection <string> >>转至LINQ

IDictionary<string, IDictionary<string, ICollection<string>>> Highlights { get; set; } 

foreach (var r in matchingProducts.Highlights) 
{ 
    string szKey = r.Key; 
    var ar = r.Value.ToArray(); 
    foreach (var s in ar) 
    { 
     string szCat = s.Key; 
     var sr = s.Value.ToArray(); 
     foreach (var t in sr) 
     { 
      string szName = t; 
      //todo: update the corresponding matchingProduct records 
      // using the return values from szKey, szCat, szName 
     } 
    } 
} 

matchingProducts

public class Product { 
    [SolrUniqueKey("id")] 
    public string Id { get; set; } 

    [SolrField("sku")] 
    public string SKU { get; set; } 

    [SolrField("name")] 
    public string Name { get; set; } 

    [SolrField("manu_exact")] 
    public string Manufacturer { get; set; } 

    [SolrField("cat")] 
    public ICollection<string> Categories { get; set; } 

    [SolrField("features")] 
    public ICollection<string> Features { get; set; } 

    [SolrField("price")] 
    public decimal Price { get; set; } 

    [SolrField("popularity")] 
    public int Popularity { get; set; } 

    [SolrField("inStock")] 
    public bool InStock { get; set; } 

    [SolrField("timestamp")] 
    public DateTime Timestamp { get; set; } 

    [SolrField("weight")] 
    public double? Weight { get; set;} 
} 
+0

有问题的字典是从SolrNet的SOLR库C#,目的是采取高亮字典并用高亮部分的文本替换相应的结果文本。我不想让代码复杂化。 – Vince 2011-05-03 23:46:45

回答

1

你可以只列举以下LINQ查询

var query = from r in Highlights 
      let szKey = r.Key 
      let szValue = r.Value 
      from s in szValue 
      let szCat = s.Key 
      let sr = s.Value 
      from t in sr 
      let szText = t 
      select new { Key = szKey, Category = szCat, Text = szText }; 

// or, also, you can use this small query 
var query = from r in Highlights 
      from s in r.Value 
      from t in s.Value 
      select new {Key = r.Key, Category = s.Key, Text = t};  

foreach(var element in query) 
{ 
    ProcessUpdate(element.Key, element.Category, element.Text); 
}  
+0

谢谢@oxilumin和@SLaks,这就是我一直在寻找的东西。 – Vince 2011-05-04 00:32:16

1

您可以通过编写

dict.Values.SelectMany(d => d.Values).SelectMany(c => c) 

在这些lambda表达式压扁字典到最里面的集合中的项目,d是内部字典,c是最里面的ICollection

你可以得到外键是这样的:

dict.SelectMany(kvpOuter => 
    kvpOuter.Value.SelectMany(kvpInner => 
     kvpInner.Value.Select(item => 
      new { 
       OuterKey = kvpOuter.Key, 
       InnerKey = kvpInner.Key, 
       Item = item, 
      } 
     ) 
    ) 
) 
+0

比我想象的要简单得多。唯一的缺点是,我还需要每个父代的值能够更新他们所属的父记录。 – Vince 2011-05-03 23:56:33

+0

我将问题的更改发布到了我想要完成的更具体的问题。 – Vince 2011-05-04 00:01:30

+1

看我的编辑。你可以把逻辑放在内部的lambda中。 – SLaks 2011-05-04 00:21:24

相关问题