Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Привести к одному типу Items и SelectedItems, ListBox-а 
V
    Опции темы
V0fka
  Дата 9.7.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Привет!

Есть ListBox. В зависимости от какого-то условия нужно обработать либо все элементы этого Листбокса, либо только выделенные элементы. Хочу написать функцию, которая бы возвращала соответственно ту или иную коллекцию элементов, для последующего её обхода в цикле foreach. Но не получается. Пишу такую функцию:

Код

private <Какой тут указать тип?> GetItems(CopyFilesMode mode)
        {
            switch (mode)
            {
                case CopyFilesMode.All:
                    return List.Items;
                    break;
                case CopyFilesMode.Selected:
                    return List.SelectedItems;
                    break;
                default:
                    return List.Items;
                    break;
            }
        }


Какой возвращаемый тип нужно в ней указать? Если указать object - потом я не могу обойти эту переменную форичем.
PM MAIL   Вверх
dzaraev
Дата 9.7.2013, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Свойство ListBox.Items имеет тип ItemCollection
Свойство ListBox.SelectedItems имеет тип IList
Тип ItemCollection реализует ряд интерфейсов и в том числе IList.
Тип IList реализует IEnumerable, поэтому может был обработан foreach.

Следовательно - возвращайте из вашего метода тип IList и всё будет ок. smile 
Также, вы можете возвращать интерфейсы: ICollection и IEnumerable, т.к. они стоят еще выше по иерархии типов.

Это сообщение отредактировал(а) dzaraev - 9.7.2013, 19:43
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
V0fka
Дата 10.7.2013, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



dzaraev, пробовал изначально IEnumerable. Но и он и все те типы, о которых говорите вы - это все generic типы (я надеюсь, я их правильно обозвал smile ). Так вот, какой тип указать IEnumerable<?> - я не допер. Пробовал IEnumerable<object> - но не работает, пишет, что неявное преобразование к такому типу невозможно. Причем, если в самой функции пишу так
Код

return (IEnumerable<object>)List.Items;

то тоже пишет, что преобразование к такому типу невозможно.
PM MAIL   Вверх
jonie
Дата 10.7.2013, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 2
Всего: 118



IEnumerable есть и не Generic типа (http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx)

Цитата(dzaraev @  9.7.2013,  20:37 Найти цитируемый пост)

Тип IList реализует IEnumerable, поэтому может был обработан foreach.

это в общем-то неверно. foreach-у наплевать на тип аргумента по которому производится итерация, т.к. он использует утиную типизацию.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
V0fka
Дата 10.7.2013, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



jonie, "Семён Семёныч..." smile

dzaraev, jonie, спасибо вам за ответы! Оба ответа полезные, оба помогли!

PM MAIL   Вверх
dzaraev
Дата 10.7.2013, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 149
Регистрация: 12.1.2013

Репутация: нет
Всего: 1



Цитата(V0fka @  10.7.2013,  09:30 Найти цитируемый пост)
dzaraev, пробовал изначально IEnumerable. 

Я вам даже ссылку заботливо указал - наведите курсор на IEnumerable в моём посте.
Вы путаете типы IEnumerable и IEnumerable<T>. Это разные классы. Также, как IList и IList<T>, ICollection и ICollection<T> - повторяю, это всё разные типы.
Generic коллекции лежат в неймспейсе System.Collections.Generic (это ссылка)
НЕ generic лежат в System.Collections (это тоже ссылка).


Цитата(jonie @  10.7.2013,  10:52 Найти цитируемый пост)
это в общем-то неверно. foreach-у наплевать на тип аргумента по которому производится итерация, т.к. он использует утиную типизацию. 

Ну, на тип аргумента foreach все-таки посматривает и в ряде случаев неявно приводит к IEnumerable,
но вы правы, моё высказывание логически не верно )) 
Правильнее было бы сказать : "Поскольку IList выглядит как IEnumerable, даёт енумератор, как IEnumerable и вообще ведёт себя как IEnumerable, то это, наверное можно неявно преобразовать в IEnumerable", но боюсь собеседник бы меня в таком случае не понял smile . 


update:
немного запоздал с ответом )

Это сообщение отредактировал(а) dzaraev - 10.7.2013, 13:35
--------------------
Если вопрос решён - помечайте тему.  
PM MAIL   Вверх
V0fka
Дата 10.7.2013, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 311
Регистрация: 5.11.2006
Где: Украина

Репутация: нет
Всего: нет



Цитата(dzaraev @  10.7.2013,  13:31 Найти цитируемый пост)
Я вам даже ссылку заботливо указал - наведите курсор на IEnumerable в моём посте.

Простите, я как-то "просмотрел", что по вашим ссылкам находятся не generic типы :( .

Цитата(dzaraev @  10.7.2013,  13:31 Найти цитируемый пост)
Вы путаете типы IEnumerable и IEnumerable<T>. Это разные классы. Также, как IList и IList<T>, ICollection и ICollection<T> - повторяю, это всё разные типы.Generic коллекции лежат в неймспейсе System.Collections.Generic (это ссылка)НЕ generic лежат в System.Collections (это тоже ссылка).

Дело в том, что у меня было подключено только пространство имен Generic и VS мне говорила, мол нету IEnumerable не generic. Вот я и застопорился. smile 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0456 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.