Некоторая справочная информация;Имея некоторую путаницу с LINQ
- LanguageResource является базовым классом
- LanguageTranslatorResource и LanguageEditorResource наследуют от LanguageResource
- LanguageEditorResource определяет свойство IsDirty
- LanguageResourceCollection представляет собой набор LanguageResource
- LanguageResourceCollection внутренне держит LanguageResources в
Dictionary<string, LanguageResource> _dict
- LanguageResourceCollection .GetEnumerator() возвращает
_dict.Values.GetEnumerator()
У меня есть языкResourceCollection _resources, который содержит только объекты LanguageEditorResource и хочет использовать LINQ для перечисления тех, которые являются грязными, поэтому я пробовал следующее. Мои конкретные вопросы выделены жирным шрифтом.
_resources.Where(r => (r as LanguageEditorResource).IsDirty)
ни где не другие методы LINQ отображаются Intellisense, но я его код в любом случае, и я сказал «LanguageResourceCollection не содержит определение для„Где“и нет метода расширения ...».
Почему способ, которым языкResourceCollection реализует IEnumerable, не позволяет ему поддерживать LINQ?Если изменить запрос к
(_resources as IEnumerable<LanguageEditorResource>).Where(r => r.IsDirty)
Intellisense отображает методы LINQ и решение компилирует. Но во время выполнения я получаю ArgumentNullException «Значение не может быть нулевым. Имя параметра: источник».
Это проблема в моем коде LINQ?
Это проблема с общим дизайном классов?
Как я могу вникнуть в то, что генерирует LINQ, чтобы попытаться выяснить, в чем проблема?
Моя цель с этим вопросом, чтобы не получить решение для конкретной задачи, так как у меня будет решать теперь с помощью другого (не LINQ) означает, а скорее, чтобы попытаться улучшить свое понимание LINQ и узнайте, как я могу улучшить дизайн своих классов, чтобы лучше работать с LINQ.
Ну, ему все равно нужно получить от LanguageResource до LanguageEditorResource и обратить внимание на внутреннее использование словаря <,> - это не * просто * базовая обертка коллекции. – 2008-11-06 09:09:01