Linq和Lambda检查嵌套项的条件

时间:2017-03-21 09:36:12

标签: c# linq lambda

我有以下对象:

public class NestedObject
{
    public string Name {get; set;}
    public Datetime date {get; set;}
}

public class MainObject
{
    public string Name {get; set;}
    public List<NestedObject> object {get; set;}
}

然后我列出了MainObjects ObjList

我现在想要从ObjList中选择最新日期比给定日期更新的条目。

如果我有一个NestedObject列表,例如NestObjList,我会执行以下操作

NestObjList.Where(x => x.date > givenDate);

我考虑过:

ObjList.Where(x => x.object.date > givenDate);

但我认为这不会遍历嵌套列表中的所有条目。

我知道我可以使用for循环执行此操作,但我尝试使用LinqLambda

执行此操作

3 个答案:

答案 0 :(得分:3)

使用Enumerable.Any检查任何嵌套对象是否与给定条件匹配

ObjList.Where(m => m.object.Any(n => n.date > givenDate))

注意:

  • 在C#中,我们使用 camelCase 作为本地变量名称
  • 在C#中,我们使用 PascalCase 作为属性,方法和类型名称
  • 以复数形式为收藏品命名

更新(如果要过滤嵌套对象):LINQ是一种查询工具。您无法修改项目并从列表中删除一些嵌套对象。但是您可以创建包含过滤数据的新主对象:

ObjList.Select(m => new MainObject {
    Name = m.Name,
    @object = m.object.Where(n => n.date > givenDate).ToList()
})
.Where(m => m.object.Any()) // remove if it's ok to have main objects without nested

根据您删除的问题

 ObjList.Where(m => !m.object.Any(n => n.date > givenDate))

如果您不想在没有嵌套到结果的情况下包含主对象,那么您仍然可以选择通过选中m.object.Any()

来过滤它们

答案 1 :(得分:1)

使用NSTreeController扩展名方法,例如

Any()

另外,请考虑不要将保留字用于您的类属性名称。您的ObjList.Where(x => x.object.Any(o => o.date > givenDate)); 属性应以不同的名称命名

object

答案 2 :(得分:1)

根据您在https://stackoverflow.com/questions/42924347/re-write-c-sharp-code-using-linq-and-lambda-can-it-be-done中所写的内容,与此类似:

var changes = query
    .Where(x => (x.nestedObject.Max(y => (DateTime?)y.date) ?? DateTime.MinValue).CompareTo(date) < 0)
    .ToList();

您正在寻找嵌套对象中的Max日期。您必须处理没有nestedObject的情况(我使用默认值DateTime.MinValue)。

其他变体,基于All()

var changes2 = query
    .Where(x => x.nestedObject.All(y => y.date.CompareTo(date) < 0))
    .ToList();

MainObject All nestedObject s必须date&lt; date给定的<div>