【问题标题】:Check if the values of Dictionary<DateTime, List<ClassA>> has a specific type of ClassA using linq?使用 linq 检查 Dictionary<DateTime, List<ClassA>> 的值是否具有特定类型的 ClassA?
【发布时间】:2017-05-27 00:37:12
【问题描述】:

我有这个字典:

Dictionary<DateTime, List<ClassA>> Delivery { get; set; }

ClassA 是这样定义的:

public class ClassA
{       
    public string abc{ get; set; }
    public long Size{ get; set; }
    .....
}

我想使用 linq 检查字典是否有字符串 abc != string.empty

所以我正在寻找这样的东西:

Delivery.Where(x => x.ClassB.classA.Values.Any(i => !String.isNullOrEmpty(i.abc))

但它没有编译,我该如何检查?

【问题讨论】:

    标签: c# linq dictionary


    【解决方案1】:

    您在 .Where 语句中迭代字典中的 KeyValuePair 项目,因此您收到错误,因为 ClassB 不是 KeyValuePair 的属性。

    类似下面的代码应该可以解决问题。在代码中,x 表示来自Delivery 的项目(这是KeyValuePair 类型)。 xKeyDateTime 类型(我们不关心),xValueList&lt;ClassA&gt; 类型,这是我们正在寻找的。

    所以,x.Value 是一个List&lt;ClassA&gt;,这意味着我们可以在该列表上调用Any 并查看每个列表项(由v 表示,其类型为ClassA)并查看它是否有一个 null 或空的 abc 属性:

    var hasItemWithEmptyAbc = Delivery.Any(x => x.Value.Any(v => string.IsNullOrEmpty(v.abc)));
    

    如果字典中的任何项目在项目的List&lt;ClassA&gt; 中具有ClassA 的任何空或空.abc 属性,这将返回一个布尔值true

    如果您想获取包含ClassA 和空abc 属性的列表的所有项目,以下将为您提供KeyValuePair&lt;DateTime, List&lt;ClassA&gt;&gt; 的列表:

    var itemsWithEmptyAbc = Delivery
        .Where(x => x.Value.Any(v => string.IsNullOrEmpty(v.abc)))
        .ToList();
    

    或者,如果您只想获取项目本身(ClassA 实例具有空的 abc 属性,您可以执行以下操作:

    var classAsWithEmptyAbc = Delivery
        .SelectMany(x => x.Value.Where(c => string.IsNullOrEmpty(c.abc)))
        .ToList();
    

    【讨论】:

    • 最初我拥有它,但我想将它分配给一个变量并从值中读取,这就是我使用 Where 的原因。问题是编译器没有识别字段 abc,因为字段 abc 实际上是 A 类中字典的值,并且该值是一个列表,所以我不得不在上面再写一个 Any()。
    • 哦,我明白了。我添加了更多方法来提取数据。一个获取所有KeyValuePair 对象的列表,其中List&lt;ClassA&gt; 包含一个ClassA 和一个空.abc,另一个只获取ClassA 一个空.abc 对象。
    猜你喜欢
    • 1970-01-01
    • 2022-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-16
    • 1970-01-01
    • 2021-02-19
    • 2012-11-04
    相关资源
    最近更新 更多