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

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

04.07.2019, 14:40. Показов 5776. Ответов 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
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
05.07.2019, 18:21  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от kolorotur Посмотреть сообщение
Задача в ее текущей постановке не реализуема в принципе.
Возможно, вы не так ее поняли и она подразумевает возврат новой последовательности с измененными элементами, но не оригинальный объект, представляющий входящую последовательность.
Естественно возврат новой последовательности, но она должна быть того же типа, что и старая (если на вход подавался string, то возвращается string с новыми элементами, если массив, - то возвратиться должен так же массив,итд )
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
05.07.2019, 18:55
Цитата Сообщение от AldTLT Посмотреть сообщение
но она должна быть того же типа, что и старая (если на вход подавался string, то возвращается string с новыми элементами, если массив, - то возвратиться должен так же массив,итд )
ну допустим я создал любой класс A и реализовал IEnumerable
этот класс не имеет публичных конструкторов, к тому же я дефолтный переопределил парой других с параметрами.
Вопрос: как этот метод должен создать новый A?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.07.2019, 19:05
Цитата Сообщение от AldTLT Посмотреть сообщение
Естественно возврат новой последовательности
Ну тогда все просто:
C#
1
2
3
4
5
6
7
8
9
public IEnumerable<T> ChangeObject<T>(IEnumerable<T> source)
{
   foreach (var item in source)
   {
      // Делаем что нужно с item
      
      yield return item;
   }
}
0
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
05.07.2019, 19:15  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Ну тогда все просто:
Ну это я сделал, только такой метод возвращает последовательность IEnumerable, а не например string
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
05.07.2019, 19:20
Цитата Сообщение от AldTLT Посмотреть сообщение
только такой метод возвращает последовательность IEnumerable, а не например string
Ну тогда мы вернулись к исходной проблеме:
Цитата Сообщение от kolorotur Посмотреть сообщение
Задача в ее текущей постановке не реализуема в принципе.
Хотя то, что вы сейчас говорите, малость противоречит тому, что вы говорили раньше:
Цитата Сообщение от AldTLT Посмотреть сообщение
Естественно возврат новой последовательности
0
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
05.07.2019, 19:26  [ТС]
Цитата Сообщение от КОП Посмотреть сообщение
ну допустим я создал любой класс A и реализовал IEnumerable
этот класс не имеет публичных конструкторов, к тому же я дефолтный переопределил парой других с параметрами.
Вопрос: как этот метод должен создать новый A?
Ну это да, поэтому я использую стандартные классы)
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
05.07.2019, 19:29
Цитата Сообщение от AldTLT Посмотреть сообщение
Ну это да, поэтому я использую стандартные классы)
то последовательность вернуть, то класс
то любой класс, то только стандартный. (стандартный вам еще расписать надо, а то окажется List стандартным а ArrayList нет )

при всем опыте форума мы все еще не знаем с чем вам помогать

вариант скопипастить сюда исходную задачу все еще самый адекватный если что
0
384 / 184 / 107
Регистрация: 07.01.2016
Сообщений: 496
06.07.2019, 07:24
AldTLT, есть пример варианта, только в нем нужно явно указывать типы в вызове метода
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        static void Main(string[] args)
        {
            var items = new[] { 1, 2, 4, 8, 16 };
 
            var items1 = Foo<int[], int>(items);
            var item2 = Foo<List<int>, int>(items.ToList());
            var item3 = Foo<Queue<int>, int>(new Queue<int>(items));
 
            Console.ReadKey();
 
        }
        static T Foo<T,U>(T items) 
            where T : class, IEnumerable<U>
            where U : IComparable
        {
            var result = items.Where(x => x.CompareTo(2) > 0).ToArray();
            var type = typeof(T);
            // т.к у массива нет конструктора
            if (type.BaseType == typeof(Array)) return result as T;
            // для типов, у которых есть конструктор
            return (T)Activator.CreateInstance(typeof(T), result);
        }
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
06.07.2019, 11:51
alexus5, выше приводил пример на лету генерируемой последовательности.

C#
1
Foo<IEnumerable<int>, int>(Noise()); // Пичалька :(
Даже если последовательность не бесконечная:
C#
1
Foo<IEnumerable<int>, int>(Noise().Take(10)); // Пичалька :(
Даже если последовательность — почти любой вызов Linq:
C#
1
Foo<IEnumerable<int>, int>(Enumerable.Range(1, 10)); // Опять пичалька :(
То, что хочет автор возможно только в очень узком диапазоне допустимых типов.
Лучше уж сразу сделать ограничение на ICollection и наличие дефолтного конструктора:
C#
1
2
3
4
5
6
7
8
9
10
11
static T Foo<T, U>(T items)
    where T : ICollection<U>, new()
{
    var result = new T();
    foreach (U item in items)
    {
        // Что-то делаем с item
        result.Add(item);
    }
    return result;
}
0
0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17
09.07.2019, 19:43  [ТС]
Всем спасибо, видимо в данном виде задача не решаема
0
Эксперт JS
6497 / 3908 / 2006
Регистрация: 14.06.2018
Сообщений: 6,781
10.07.2019, 05:18
Цитата Сообщение от AldTLT Посмотреть сообщение
видимо в данном виде задача не решаема
В данном случае и если действительно задача НЕ студенческая, то имеем:
Цель - получить какое-то количество денег.
Способ достижения цели - неверно выбран.

Вывод - переписать техническое задание и использовать алгоритмы и необходимые библиотеки, которые соответствуют пути достижения цели.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16166 / 11286 / 2892
Регистрация: 21.04.2018
Сообщений: 33,177
Записей в блоге: 2
10.07.2019, 12:35
Цитата Сообщение от AldTLT Посмотреть сообщение
видимо в данном виде задача не решаема
Задача решаема, но ваш способ реализации бессмыслен.
Решение задачи (приложения в целом) начинается с формирования ТЗ и проектирования архитектуры приложения. На этом этапе выбирается как ЯП так и средства необходимые для реализации, составляются ТЗ к отдельным частям приложения. ТЗ к частям приложения составляются с учётом выбранного ЯП и используемых библиотек.
Раз вам понадобилось от ЯП что-то неисполнимое, неосуществимое, бессмысленное, то большая вероятность (практически 100%), что это вызвано ошибками в архитектуре приложения.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.07.2019, 12:35

Приведение пользовательского типа к типу 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++, и есть такой вопрос, можно ли при инстанцировании, допустим, шаблонной функции привести один параметр-тип к...


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

Или воспользуйтесь поиском по форуму:
32
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru