我有以下对象:
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循环执行此操作,但我尝试使用Linq
和Lambda
答案 0 :(得分:3)
使用Enumerable.Any
检查任何嵌套对象是否与给定条件匹配
ObjList.Where(m => m.object.Any(n => n.date > givenDate))
注意:
更新(如果要过滤嵌套对象):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>
。