【发布时间】:2008-11-06 08:31:08
【问题描述】:
一些背景信息;
- LanguageResource 是基类
- LanguageTranslatorResource 和 LanguageEditorResource 继承自 LanguageResource
- LanguageEditorResource 定义了一个 IsDirty 属性
- LanguageResourceCollection 是 LanguageResource 的集合
- LanguageResourceCollection 在内部将 LanguageResources 保存在
Dictionary<string, LanguageResource> _dict - LanguageResourceCollection.GetEnumerator() 返回
_dict.Values.GetEnumerator()
我有一个 LanguageResourceCollection _resources,它只包含 LanguageEditorResource 对象,并且想使用 LINQ 来枚举那些脏的,所以我尝试了以下方法。我的具体问题以粗体显示。
_resources.Where(r => (r as LanguageEditorResource).IsDirty)
Intellisense 不会显示其他 LINQ 方法,但我还是对其进行了编码,并被告知“LanguageResourceCollection 不包含 'Where' 的定义并且没有扩展方法......”。
为什么LanguageResourceCollection 实现 IEnumerable 的方式使其无法支持 LINQ?如果我将查询更改为
(_resources as IEnumerable<LanguageEditorResource>).Where(r => r.IsDirty)
Intellisense 显示 LINQ 方法并编译解决方案。但是在运行时我得到一个 ArgumentNullException “值不能为空。参数名称:源”。
这是我的 LINQ 代码中的问题吗?
类的一般设计有问题吗?
如何深入了解 LINQ 生成的内容以尝试查看问题所在?
我对这个问题的目的不是为特定问题找到解决方案,因为我现在必须使用其他(非 LINQ)方法来解决它,而是尝试提高我对 LINQ 的理解并学习如何做改进我的类设计以更好地使用 LINQ。
【问题讨论】:
标签: c# .net linq linq-to-objects