Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > WPF и Silverlight > Привести к одному типу Items и SelectedItems


Автор: V0fka 9.7.2013, 10:56
Привет!

Есть 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 - потом я не могу обойти эту переменную форичем.

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

Следовательно - возвращайте из вашего метода тип http://msdn.microsoft.com/en-us/library/system.collections.ilist(v=vs.100).aspx и всё будет ок. smile 
Также, вы можете возвращать интерфейсы: http://msdn.microsoft.com/en-us/library/System.Collections.ICollection(v=vs.100).aspx и http://msdn.microsoft.com/en-us/library/system.collections.ienumerable(v=vs.100).aspx, т.к. они стоят еще выше по иерархии типов.

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

return (IEnumerable<object>)List.Items;

то тоже пишет, что преобразование к такому типу невозможно.

Автор: jonie 10.7.2013, 10:52
IEnumerable есть и не Generic типа (http://msdn.microsoft.com/en-us/library/system.collections.ienumerable.aspx)

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

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

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

Автор: V0fka 10.7.2013, 13:10
jonie, "Семён Семёныч..." smile

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

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

Я вам даже ссылку заботливо указал - наведите курсор на IEnumerable в моём посте.
Вы путаете типы IEnumerable и IEnumerable<T>. Это разные классы. Также, как IList и IList<T>, ICollection и ICollection<T> - повторяю, это всё разные типы.
Generic коллекции лежат в неймспейсе http://msdn.microsoft.com/en-us/library/system.collections.generic.aspx (это ссылка)
НЕ generic лежат в http://msdn.microsoft.com/en-us/library/system.collections.aspx (это тоже ссылка).


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

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


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

Автор: V0fka 10.7.2013, 13:53
Цитата(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 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)