LINQ列出<键值对>

时间:2018-10-23 08:47:06

标签: c# linq keyvaluepair

我目前正在开发.NET Framework 4.7.2应用程序。我正在研究一个LINQ查询,它从给定的数据结构中选择对象:

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

它是动态对象的列表。我需要从列表中选择所有元素,其中字典中的 value 值为 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和Dictionary,因此有点棘手。

非常感谢您!

2 个答案:

答案 0 :(得分:5)

这应该有效:

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);

答案 1 :(得分:1)

您指定了:

  

我想选择一个List<KeyValuePair<int, Dictionary<string, object>>>,其中字典中的值对象是布尔类型   并具有true值。

值对象?这是否意味着列表中的所有词典只有一个值?

  • 还是只希望列表中的那些元素具有仅具有一个值的“字典”:布尔值是否为真?
  • 还是只希望列表中具有至少一个布尔值为true的Dictionary的那些元素?
  • 或者所有值都应该是具有真实值的布尔值?

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());

这可以优化,使用它您将两次枚举字典。我这样做是为了提高可读性。

第二个规范:仅保留列表中具有至少一个布尔值为布尔值的Dictionary的那些元素

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());

通过这些示例,可以轻松地编写版本,其中字典中的所有项目都必须是具有真实值的布尔值