C# 4.0 IDictionary<;字符串,IDictionary<;字符串,ICollection<;字符串>&燃气轮机&燃气轮机;林克

C# 4.0 IDictionary<;字符串,IDictionary<;字符串,ICollection<;字符串>&燃气轮机&燃气轮机;林克,c#-4.0,solrnet,C# 4.0,Solrnet,我一直在尝试将下面的foreach语句转换为LINQ语句,但似乎无法理解它。欢迎任何帮助 IDictionary<string, IDictionary<string, ICollection<string>>> Highlights { get; set; } foreach (var r in matchingProducts.Highlights) { string szKey = r.Key; var ar = r.Value.ToA

我一直在尝试将下面的foreach语句转换为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
        }
    }
}
IDictionary突出显示{get;set;}
foreach(matchingProducts.Highlights中的var r)
{
字符串szKey=r.Key;
var ar=r.Value.ToArray();
foreach(ar中的var s)
{
字符串szCat=s.键;
var sr=s.Value.ToArray();
foreach(sr中的var t)
{
字符串szName=t;
//todo:更新相应的匹配产品记录
//使用来自szKey、szCat、szName的返回值
}
}
}
配套产品

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;}
}
公共类产品{
[SolrUniqueKey(“id”)]
公共字符串Id{get;set;}
[索尔菲尔德(“sku”)]
公共字符串SKU{get;set;}
[索尔菲尔德(“姓名”)]
公共字符串名称{get;set;}
[SolrField(“manu_确切”)]
公共字符串制造商{get;set;}
[索尔菲尔德(“猫”)]
公共ICollection类别{get;set;}
[索尔菲尔德(“特色”)]
公共ICollection功能{get;set;}
[索尔菲尔德(“价格”)]
公共十进制价格{get;set;}
[索尔菲尔德(“人气”)]
公共属性{get;set;}
[SolrField(“inStock”)]
公共bool InStock{get;set;}
[索尔菲尔德(“时间戳”)]
公共日期时间时间戳{get;set;}
[索尔菲尔德(“重量”)]
公共双权重{get;set;}
}

您可以通过编写

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,
            }
        )
    )
)

您可以只枚举以下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);
}    

所讨论的字典来自SolrNet,即C#的SOLR库,其目的是获取突出显示字典并用突出显示部分的文本替换相应的结果文本。我不想使代码过于复杂,这比我想象的要简单得多。唯一值得一提的是,我还需要前面每个父级的值,以便能够更新它们所属的父级记录。我将问题的更改发布到了我试图实现的更具体的内容中。谢谢@oxilumin和@SLaks,这就是我要找的。