いくつかの背景情報;
- LanguageResource は基本クラスです
- LanguageTranslatorResource と LanguageEditorResource は LanguageResource から継承します
- LanguageEditorResource は IsDirty プロパティを定義します
- LanguageResourceCollection は LanguageResource のコレクションです
- LanguageResourceCollection は内部的に LanguageResources を保持します
Dictionary<string, LanguageResource> _dict
- LanguageResourceCollection.GetEnumerator() が返す
_dict.Values.GetEnumerator()
LanguageEditorResource オブジェクトのみを含む LanguageResourceCollection _resources があり、LINQ を使用してダーティなものを列挙したいので、次のことを試しました。私の具体的な質問は太字で示しています。
_resources.Where(r => (r as LanguageEditorResource).IsDirty)
どちらも Where not 他の LINQ メソッドは Intellisense によって表示されますが、とにかくコーディングすると、「LanguageResourceCollection には 'Where' の定義が含まれておらず、拡張メソッドもありません...」と言われます。
LanguageResourceCollection が IEnumerable を実装する方法によって、LINQ のサポートが妨げられるのはなぜですか?クエリを
(_resources as IEnumerable<LanguageEditorResource>).Where(r => r.IsDirty)
Intellisense に変更すると、LINQ メソッドが表示され、ソリューションがコンパイルされます。しかし、実行時に ArgumentNullException 「値を null にすることはできません。パラメータ名: ソース」が発生します。
これは私の LINQ コードの問題ですか?
クラスの一般的な設計に問題がありますか?
LINQ が生成するものを掘り下げて、問題の内容を確認するにはどうすればよいですか?
この質問に対する私の目的は、特定の問題の解決策を得ることではなく、他の (LINQ 以外の) 手段を使用して解決する必要があるためです。むしろ、LINQ の理解を深め、設計を改善する方法を学ぶことです。私のクラスの LINQ でより適切に動作します。