0 / 0 / 0
Регистрация: 03.06.2019
Сообщений: 17

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

04.07.2019, 14:40. Показов 5694. Ответов 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
 Аватар для Элд Хасп
16165 / 11285 / 2892
Регистрация: 21.04.2018
Сообщений: 33,174
Записей в блоге: 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru