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

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

04.07.2019, 14:40. Показов 5692. Ответов 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
Ответ Создать тему
Новые блоги и статьи
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
[EasyBuilder Pro] Памятка по разработке для панелей Weintek
ФедосеевПавел 26.08.2026
Памятка по разработке для панелей Weintek ВВЕДЕНИЕ Ранее, при реализации проектов основное внимание уделял разработке управляющей программы для контроллера, а панели оператора доставалось время. . .
Модель по догадкам
anaschu 25.08.2026
Прошло две недели. Я уже рассказывал, как разговаривал с сотрудниками у сортировки и как понял, что главная ветка — не про приёмку, а про отбор. Но тогда я думал, что понял механику. На этой неделе я. . .
Запись в регистр сведений независимо от заполненности табличной части
Maks 25.08.2026
Реализация из решения ниже выполнена на нетиповом документе с несколькими табличными частями, разработанного в КА2. Задача: Обеспечить запись документа в регистр сведений независимо от. . .
Ноутбук Альфария
kumehtar 24.08.2026
Встретился тут в сети ноутбук Альфария, примарха Альфа-Легиона. Хотя возможно, это ноутбук Омегона, разумеется. Ну как вам?
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru