В настоящее время я работаю над приложением .NET Framework 4.7.2. Я работаю над запросом LINQ, выбирающим объекты из данной структуры данных:
List<KeyValuePair<int, Dictionary<string, object>>>
Это список динамических объектов. Мне нужно выбрать все элементы из списка, где ценить в словаре - правда, в этом случае ключ будет IsDummy.
На следующем изображении показана структура данных xyz в режиме отладки:
var result = xyz
.Select(a => a.Value)
.SelectMany(b => b)
.Where(c => c.Key == "IsDummy" && (bool)c.Value == true);
Я хотел бы выбрать List<KeyValuePair<int, Dictionary<string, object>>>, где объект значения в словаре имеет логический тип и имеет значение true.
К сожалению, мой текущий запрос работает некорректно.
Вы знаете, как решить этот LINQ-запрос? Это немного сложно из-за KeyValuePair и Dictionary в списке.
Большое спасибо!
вот как поступают данные ... к сожалению, я не могу это изменить ...
Что именно вы хотите выбрать? KeyValuePair<int, Dictionary<string, object>>, где в словаре есть ключ "IsDummy" и object из true? или соответствующий int? или словарь?
спасибо за внимание!





Это должно работать:
var result = xyz
.Where(kv => kv.Value.TryGetValue("IsDummy", out object value)
&& value is bool b && b); // pattern matching C#7
Версия не C# 7:
...
&& value is bool && (bool)value);
Отличное решение Тим, спасибо! Мне нужно больше узнать о сопоставлении с образцом в C# 7. :)
Вы указали:
I would like to select a
List<KeyValuePair<int, Dictionary<string, object>>>where the value object in the dictionary is of type boolean and has the value true.
Объект значения В? Означает ли это, что все словари в списке имеют только одно значение?
.
List<KeyValuePair<int, Dictionary<string, object>>> source = ...
var result = source
// keep only those items in the list that have a Dictionary with only one value,
// namely a Boolean that is true
.Where(pair => pair.Value.Count == 1
// pair.Value is a Dictionary;
// pair.Value.Values are the values in the Dictionary
// only keep this item if the one and only value in the dictionary is a Boolean with a value true
&& pair.Value.Values.First().GetType() == typeof(bool)
&& (bool)pair.Value.ValuesFirst());
Это можно оптимизировать, используя это, вы дважды пронумеруете словарь. Я оставляю это так для удобства чтения.
2-я спецификация: сохранить только те элементы из списка, у которых есть словарь, в котором есть хотя бы одно логическое значение с истинным значением.
var result = source
.Where(pair => pair.Value.Values
// keep only the values in the dictionary that are Boolean:
.OfType<bool>()
// keep only the true values
.Where(dictionaryValue => dictionaryValue)
// keep this list item if there is at least one such value in the dictionary
.Any());
С помощью этих примеров будет легко закодировать версию, в которой все элементы в словаре должны быть логическими с истинным значением.
Нет LINQ-запроса для решения. Что у тебя так далеко?