2011-05-03 6 views
1

Я пытаюсь преобразовать оператор foreach ниже в оператор LINQ, но, похоже, не может обернуться вокруг него. Любая помощь приветствуется.IDictionary <строка, IDictionary <строка, 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

ответ

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

1

Вы можете придавить словарь к элементам внутренней коллекции, написав

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

В этих лямбда-выражений, 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

+0

Я отправил изменение на вопрос более конкретно в том, что я пытаюсь выполнить. – Vince

+1

См. Мое редактирование. Вы можете поместить логику во внутреннюю лямбду. – SLaks

Смежные вопросы