c# - 多对象类型嵌套 LINQ 查询
问题描述
我正在填充我的 xaml 绑定一个ObservableCollection<FrameworkElement>
称为DaysCollection到一个ItemsControl
's ItemSource
。
我在列表中推送的对象是类型Day
每个对象都有一个类似的结构:一个ItemsControl
填充ItemSource
有对象的Things
对象,这些对象具有一个 TimeStamp 属性。
我正在尝试使用 LINQ 在DaysCollectionThings
列表中查找包含正确时间戳的对象。
我尝试了以下方法:
var test = DaysCollection .Where(x => (x.DataContext as List<Days>).Any(y => (y.DataContext as List<Things>).Any(z => z.TimeStamp == value))).First();
但我得到了错误:
System.ArgumentNullException: 'Value cannot be null.
Parameter name: source'
解决方案
由于as
类型转换操作可以在类型不多时返回 null,因此后续调用.Any()
可能会导致上述异常。
您绝对确定 DataContext 内部是 TypeList<Days>
吗?如果不是,请尝试使用IEnumerable<Days>
,它允许更广泛的集合实现选择。
此外,您应该使用 null 条件 ( ?.
) 和 null 合并 ( ??
) 运算符检查强制转换是否为 null。下面的代码可能有效,但您可能需要更多括号。;)
还.First()
确保您收到至少一个且恰好是一个元素。(虽然集合中可能还有更多。)如果您的查询没有返回结果,这也会引发异常。.FirstOrDefault()
如果您想自己处理这种情况,您可能想要使用。
var test = DaysCollection
.Where(x => (x.DataContext as IEnumerable<Days>)
?.Any(y => (y.DataContext as IEnumerable<Things>)
?.Any(z => z.TimeStamp == value) ?? false)
?? false
).First();
推荐阅读
- python - Pycharm 添加命令
- sql - 如何检查Oracle sql中列之间单词的前两个字符是否相等
- javascript - Toggle B/W multiple camera on button 点击网页:HTML、JS
- python - Tensorflow:识别没有梯度的自定义损失函数中的操作
- google-apps-script - 应用脚本时间触发器根本不执行我的脚本
- reactjs - 反应状态钩子没有将更改传递给元素
- apache-camel - Apache Camel:在同一个 SFTP 的不同文件夹中复制文件
- java - java如何编译使用StringAppend添加字符串的操作以及如何定义这样的自创对象的操作行为
- android - Android 开发:已从 html 字符串生成 Pdf。在底部添加文本
- django - django-allauth:如何避免请求好友列表?