Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17

Приведение типа IEnumerable к любому типу

04.07.2019, 14:40. Показов 5470. Ответов 31

Студворк — интернет-сервис помощи студентам
Добрый день.
Задача: на вход метода подается объект, реализующий IEnumerable (строка, массив, список итд.), необходимо выполнить действия с объектом (скажем, удалить все элементы, которые равны и стоят рядом) и вернуть преобразованный объект.

Я написал метод расширения IEnumerable, который делает действия с объектом, но он естественно возвращает объект IEnumerable.
Как преобразовать IEnumerable в тот же тип объекта, который подается на вход что бы вернуть измененную последовательность?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.07.2019, 14:40
Ответы с готовыми решениями:

Приведение элементов к типу интерфейса IEnumerable
В методичке идёт пояснение по поводу стандартных интерфейсов и ключевого слова yield: Следующий пример демонстрирует перебор значений...

Приведение значения переменной типа char к типу int
Подскажите, как))

Как организовать неявное приведение типа перечисления к типу переменной
Неудобно ведь писать его каждый раз. Надеюсь это возможно? struct HumanInfo { string fullName; byte ...

31
2810 / 1679 / 885
Регистрация: 14.04.2015
Сообщений: 5,723
04.07.2019, 14:42
AldTLT, код в студию
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
04.07.2019, 14:53
Цитата Сообщение от AldTLT Посмотреть сообщение
Как преобразовать IEnumerable в тот же тип объекта
C#
1
2
3
4
5
        public FOO<T> GetT<T>(FOO<T> mass)
        {
            IEnumerable<T> t = mass;
            return t as FOO<T>;
        }
0
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
04.07.2019, 17:41  [ТС]
Цитата Сообщение от AndreyVorobey Посмотреть сообщение
AldTLT, код в студию
Код метода расширения не важен, если хотите, вместо него можно использовать LINQ, результат то же.
Главное - после запроса преобразовать IEnumerable обратно в нужный тип.

Цитата Сообщение от Рядовой Посмотреть сообщение
public FOO<T> GetT<T>(FOO<T> mass)
{
IEnumerable<T> t = mass;
return t as FOO<T>;
}
Что за FOO?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.07.2019, 18:33
Цитата Сообщение от AldTLT Посмотреть сообщение
необходимо выполнить действия с объектом (скажем, удалить все элементы, которые равны и стоят рядом) и вернуть преобразованный объект.
Как это планируется делать с IEnumerable, в котором нет ни методов, ни свойств для изменения последовательности?
Похоже, что если вам надо менять непосредственно источник, то надо принимать не IEnumerable, а ICollection.
IEnumerable не обязана гарантировать, что ее реализует класс с каким-то хранилищем.
0
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
04.07.2019, 18:45
Цитата Сообщение от AldTLT Посмотреть сообщение
Что за FOO?
Цитата Сообщение от AldTLT Посмотреть сообщение
объект, реализующий IEnumerable
...
0
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
04.07.2019, 20:42  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Как это планируется делать с IEnumerable, в котором нет ни методов, ни свойств для изменения последовательности?
Похоже, что если вам надо менять непосредственно источник, то надо принимать не IEnumerable, а ICollection.
IEnumerable не обязана гарантировать, что ее реализует класс с каким-то хранилищем.
Создается новая измененная последовательность, как например в LINQ запросах.

Добавлено через 49 минут
Цитата Сообщение от Рядовой Посмотреть сообщение
Сообщение от AldTLT
Что за FOO?
Сообщение от AldTLT
объект, реализующий IEnumerable
Не понятно как это реализовать.
Вот примерный код:

C#
1
2
3
4
5
6
7
        public T ChangeObject<T>(T source)  //на входе может быть любой объект, например string
            where T : IEnumerable<object>
        {
            var result = source.DoSomethingUsefull();   //получаем новую последовательность 
            return...  //вот тут надо вернуть новую последовательность такого же типа, например string. 
                          //Как это можно сделать?
        }
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
04.07.2019, 20:56
В T должен быть конструктор принимающий IEnumerable.
После изменений создаете новый обьект T используя этот конструктор
0
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
04.07.2019, 21:27  [ТС]
Цитата Сообщение от nicolas2008 Посмотреть сообщение
В T должен быть конструктор принимающий IEnumerable.
После изменений создаете новый обьект T используя этот конструктор
Можете код написать?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
04.07.2019, 21:35
Цитата Сообщение от AldTLT Посмотреть сообщение
Создается новая измененная последовательность, как например в LINQ запросах.
Так последовательность или тот же тип?
Если последовательность, то через yield return
0
1152 / 860 / 263
Регистрация: 30.04.2009
Сообщений: 3,603
04.07.2019, 21:51
Цитата Сообщение от AldTLT Посмотреть сообщение
Можете код написать?
C#
1
2
3
4
5
        public static List<T> DoSomethingGreat<T>(List<T> source)
        {
            var modified = source.Take(5);
            return new List<T>(modified);
        }
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
05.07.2019, 08:56
Цитата Сообщение от AldTLT Посмотреть сообщение
Как преобразовать IEnumerable в тот же тип объекта, который подается на вход что бы вернуть измененную последовательность?
Ответ простой и штатным методом:
query.ToArray()
query.ToList()
и так далее ToXXX()

Причём можно это делать и в отдельном методе после того, как все yield return отработали.
0
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
05.07.2019, 15:00  [ТС]
Цитата Сообщение от amr-now Посмотреть сообщение
Ответ простой и штатным методом:
query.ToArray()
query.ToList()
и так далее ToXXX()
Причём можно это делать и в отдельном методе после того, как все yield return отработали.
Только ты не знаешь какой тип у тебя на входе, он может быть любой.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
05.07.2019, 15:05
AldTLT, знает тот, кто кидает на вход. Соответственно, он же и знает, во что ему превратить последовательность.
Это самый простой выход из проблемы.

Альтернатива - в самом методе расширения ковырять рефлексию. Но практика показывает, что ковыряльцы обычно тонут в результатах своего кодерства.
Не, я согласен, можно форкнуть проект, расковырять рефлексию. Если вдруг получится, то поставить текст в рамочку и повесить над диваном.
0
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
05.07.2019, 15:10  [ТС]
Цитата Сообщение от amr-now Посмотреть сообщение
AldTLT, знает тот, кто кидает на вход. Соответственно, он же и знает, во что ему превратить последовательность.
Это самый простой выход из проблемы.
Не, по условиям задачи не подходит. Надо принять объект, реализующий IEnumerable, сделать действия с его элементами, вернуть обратно.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
05.07.2019, 15:15
AldTLT, задача студенческая? Если студенческая, то приведите текст задачи.

Если не студенческая, то скорее всего неправильно поставлено ТЗ.

Обычно программист скорее всего подумает, что с 50% вероятности заказчик с исполнителем не поняли друг друга.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.07.2019, 15:17
Цитата Сообщение от AldTLT Посмотреть сообщение
Надо принять объект, реализующий IEnumerable, сделать действия с его элементами, вернуть обратно.
Задача в ее текущей постановке не реализуема в принципе.
Возможно, вы не так ее поняли и она подразумевает возврат новой последовательности с измененными элементами, но не оригинальный объект, представляющий входящую последовательность.
0
Эксперт JS
6496 / 3907 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
05.07.2019, 15:21
kolorotur, теоретически реализуемая в частных случаях через рефлексию.
Но код будет классическим образцом Г-кода.
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.07.2019, 15:52
Цитата Сообщение от amr-now Посмотреть сообщение
в частных случаях
Дык в том и дело, а требуют вроде как "любой тип".
Если я на вход подам что-то вроде такого:
C#
1
2
3
4
5
IEnumerable<int> Noise()
{
   var r = new Random();
   while (true) yield return r.Next();
}
C#
1
ChangeObject(Noise());
То удачи изменять исходный объект хоть с рефлексией, хоть без.
1
05.07.2019, 15:55

Не по теме:

Вы должны добавить отзыв кому-то ещё, прежде чем сможете снова добавить его kolorotur.
:(

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
05.07.2019, 15:55
Помогаю со студенческими работами здесь

Приведение пользовательского типа к типу int
Написан класс DateTime и перегружены его операторы, в частности ввод/вывод в консоль и в файл. Код: #include &lt;iostream&gt; #include...

Приведение типа объекта XtraForm к типу Form
Здравствуйте. Есть функция, которая определяет родительскую форму (Form)fn.Target, но ее нужно использовать с окном типа...

Ошибка при использовании IEnumerable<T>: Использование универсального типа IEnumerable требует аргумент типа 1
Доброго Вам времени суток. Помогите решить следующую задачку. На строке IEnumerable&lt;Device&gt; = deviceContext.Devices; возникает...

Ошибка: Приведение типа DBNull к типу String является недопустимым
В чём может быть проблема с базой (таблицей), если в созданном для базы приложении хочу осуществить поиск в таблице DataGridView, но...

Приведение одного парметра-типа к другому разыменованному парметру-типу (указателю) в шаблонах
Здравствуйте! изучаю C++, и есть такой вопрос, можно ли при инстанцировании, допустим, шаблонной функции привести один параметр-тип к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru