Подтвердить что ты не робот

LINQ select в словаре С#

У меня есть следующий словарь в С#

Dictionary<string, object> subDictioanry = new Dictionary<string, object>();

List<Dictionary<string, string>> subList = new List<Dictionary<string, string>>();
subList.Add(new Dictionary<string, string>(){
{"valueLink", "link1"},
{"valueTitle","title1"}
});
subList.Add(new Dictionary<string, string>(){
{"valueLink", "link2"},
{"valueTitle","title2"}
});
subList.Add(new Dictionary<string, string>(){
{"valueLink", "link3"},
{"valueTitle","title3"}
});

subDictioanry.Add("title", "title");
subDictioanry.Add("name", "name");
subDictioanry.Add("fieldname1", subList);

Dictionary<string, object> exitDictionary = new Dictionary<string, object>();
exitDictionary.Add("first", subDictioanry);
exitDictionary.Add("second", subDictioanry);

Можно ли получить все "valueTitle" с помощью выбора LINQ?

UPDATE: Извините, я должен написать сначала - мне нужно получить результат из exitDictionary, а не из subList

4b9b3361

Ответ 1

Если вы выполняете поиск по значению fieldname1, попробуйте следующее:

var r = exitDictionary
   .Select(i => i.Value).Cast<Dictionary<string, object>>()
   .Where(d => d.ContainsKey("fieldname1"))
   .Select(d => d["fieldname1"]).Cast<List<Dictionary<string, string>>>()
   .SelectMany(d1 => 
       d1
        .Where(d => d.ContainsKey("valueTitle"))
        .Select(d => d["valueTitle"])
        .Where(v => v != null)).ToList();

Если вы смотрите по типу значения в subDictionary (Dictionary<string, object> явно), вы можете сделать это:

var r = exitDictionary
   .Select(i => i.Value).Cast<Dictionary<string, object>>()
   .SelectMany(d=>d.Values)
   .OfType<List<Dictionary<string, string>>>()
   .SelectMany(d1 => 
       d1
        .Where(d => d.ContainsKey("valueTitle"))
        .Select(d => d["valueTitle"])
        .Where(v => v != null)).ToList();

Обе альтернативы вернутся:

title1
title2
title3
title1
title2
title3

Ответ 2

Одним из способов было бы сначала сгладить список с помощью SelectMany:

subList.SelectMany(m => m).Where(k => k.Key.Equals("valueTitle"));

Ответ 3

Это вернет все значения, соответствующие вашему ключу valueTitle

subList.SelectMany(m => m).Where(kvp => kvp.Key == "valueTitle").Select(k => k.Value).ToList();