LINQ к списку <KeyValuePair> - PullRequest
       9

LINQ к списку <KeyValuePair>

0 голосов
/ 23 октября 2018

В настоящее время я работаю над приложением .NET Framework 4.7.2.Я работаю над запросом LINQ, выбирая объекты из заданной структуры данных:

List<KeyValuePair<int, Dictionary<string, object>>>

Это список динамических объектов.Мне нужно выбрать все элементы из списка, где значение в словаре равно true , в этом случае ключом будет IsDummy.

На следующем рисунке показаноструктура данных xyz в режиме отладки:

enter image description here

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>>>, где значениеобъект в словаре имеет тип boolean и имеет значение true.

К сожалению, мой текущий запрос не работает правильно.

Знаете ли вы, как решить этот запрос LINQ?Это немного сложно из-за KeyValuePair и словаря в списке.

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 23 октября 2018

Вы указали:

Я хотел бы выбрать List<KeyValuePair<int, Dictionary<string, object>>>, где объект значения в словаре имеет тип boolean и имеет значение true.

Объект значения ?Означает ли это, что все словари в списке имеют только одно значение?

  • Или вы хотите, чтобы только те элементы из вашего списка имели словарь, который имеет только одно значение: логическое значение true?
  • Или вы хотите, чтобы в вашем списке были только те элементы, в которых есть словарь с хотя бы одним логическим значением 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());

С этимиНапример, будет легко закодировать версию, где все элементы в словаре должны быть логическими с истинным значением

0 голосов
/ 23 октября 2018

Это должно работать:

var result = xyz
    .Where(kv => kv.Value.TryGetValue("IsDummy", out object value) 
                 && value is bool b && b); // pattern matching C#7

Non C # 7 версия:

...
&& value is bool && (bool)value);
...