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

Синтаксис последовательного вызова методов

22.12.2017, 18:39. Показов 4107. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Наткнулся в учебнике на код. Может быть я его неправильно понял. Но выглядит так, как будто вызываются последовательно методы класса.
C#
1
 decimal arrayTotal = productArray.FilterByPrice(20).TotalPrices();
Здесь в коде после имени объекта после первой точки вызывается один метод класса, а после второй точки - другой метод класса. Раньше я подобного синтаксиса не видел.
И при этом результат работы первого метода передаётся второму методу и он уже присваивает результат своей работы в переменную arrayTotal.
Попытался написать подобный код в консольном проекте, и у меня не получилось. А в коде написанному по учебнику всё работает.

Вот класс с методами
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
 public static class MyExtensionMethods
    {
        public static decimal TotalPrices(this IEnumerable<Product> products)
        {
            decimal total = 0;
            foreach (Product prod in products)
            {
                total += prod?.Price ?? 0;
            }
            return total;
        }
 
        public static IEnumerable<Product> FilterByPrice(this IEnumerable<Product> products, decimal minPrice)
        {
            foreach (Product prod in products)
            {
                if ((prod?.Price ?? 0) >= minPrice)
                {
                    yield return prod;
                }
            }
        }
    }
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.12.2017, 18:39
Ответы с готовыми решениями:

Разобрать синтаксис вызова метода
Здравствуйте, подскажите что означает данный синтаксис вызова метода: Process.Start(new ProcessStartInfo(Application.ExecutablePath,...

Список методов для последовательного исполнения
Добрый день. Возможно ли создать список методов и последовательно запускать их, передавая нужные элементы? Может какая-то другая...

Исследовать эффективность методов поиска (последовательного, интерполяционного)
А) Исследовать эффективность методов поиска (последовательного, интерполяционного). Предлагаемый тест: поиск т элементов в целочисленном...

6
Эксперт .NET
 Аватар для Usaga
14292 / 9377 / 1352
Регистрация: 21.01.2016
Сообщений: 35,339
22.12.2017, 18:42
manumozz, метод имеет право возвращать ЛЮБОЙ тип данных. В том числе ссылку на экземпляр какого-то класса. К этому экземпляру можно сразу же и обратиться, не сохраняя в переменную. Так что ничего волшебного тут нет.
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,892
Записей в блоге: 1
22.12.2017, 18:52
Цитата Сообщение от manumozz Посмотреть сообщение
Попытался написать подобный код в консольном проекте, и у меня не получилось. А в коде написанному по учебнику всё работает.
Данный код должен работать в каком угодно приложении. Покажи весь код чтобы понять почему именно не получилось.
0
2 / 2 / 0
Регистрация: 16.04.2015
Сообщений: 73
22.12.2017, 19:03  [ТС]
Спасибо за быстрый ответ. Я отредактировал свой проект и сделал методы расширяющими, и всё заработало. А с обычными методами такой вызов не получился. Методы в обоих классах одинаковые, за исключением того, что в одном они расширяющие, а в другом - нет.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 static void Main(string[] args)
        {
            IEnumerable<int> nums = new List<int>{1, 2, 3, 4, 5};
            nums = nums.FillList(3).GetList();//так работает, при этом вызываю методы расширения.
            foreach (int n in nums)
            {
                    Console.WriteLine(n);
            }
 
            IEnumerable<int> digits = new List<int>{1, 2, 3, 4, 5};
            nums = Methods.FillColl(digits,3)//хочу здесь вызвать второй  (не расширяющий) метод класса и не могу, почему?
            foreach (int n in digits)
            {
                    Console.WriteLine(n);
            }
            
        }
класс с расширяющими методами
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public static  class ExtendMethods
    {
        public static IEnumerable<int> FillList(this IEnumerable<int> list, int gvul)
        {
            foreach (int n in list)
            {
                if (n > gvul)
                    yield break;
                yield return n;
            }
        }
        public static IEnumerable<int> GetList(this IEnumerable<int> list)
        {
            return list;
        }
    }
класс с обычными методами

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 static class Methods
    {
        public static IEnumerable<int> FillColl(IEnumerable<int> list, int gvul)
        {
            foreach (int n in list)
            {
                if (n > gvul)
                    yield break;
                yield return n;
            }
        }
        public static IEnumerable<int> GetColl(IEnumerable<int> list)
        {
            return list;
        }
    }
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,892
Записей в блоге: 1
22.12.2017, 19:12
manumozz, 1) тебя попросили выложить весь код, а не его часть. Например, можно загрузить на форум архив решения.
2) когда что-то "не можется" следует выкладывать текст(ы) ошибки и/или описание что ожидалось от программы и что она делает на самом деле.
0
2 / 2 / 0
Регистрация: 16.04.2015
Сообщений: 73
22.12.2017, 19:15  [ТС]
1. это весь код.
2. на 11 строке в Main второй метод не вызывается (среда не видит второй метод)
0
Администратор
Эксперт .NET
 Аватар для OwenGlendower
18291 / 14214 / 5368
Регистрация: 17.03.2014
Сообщений: 28,892
Записей в блоге: 1
22.12.2017, 20:38
Лучший ответ Сообщение было отмечено manumozz как решение

Решение

Цитата Сообщение от manumozz Посмотреть сообщение
это весь код.
Сейчас да. Когда я писал ответ был только код метода Main.

Цитата Сообщение от manumozz Посмотреть сообщение
на 11 строке в Main второй метод не вызывается (среда не видит второй метод)
C#
1
nums = Methods.GetColl(Methods.FillColl(digits,3));
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
22.12.2017, 20:38
Помогаю со студенческими работами здесь

Непонятный синтаксис вызова функции с лямбда-аргументом
Здравствуйте! Не могу понять как работает такой вызов функции: var x1 = Apply1(f, 100)(1, 11); Ответьте пожалуйста, почему две пары...

Порядок вызова унаследованных методов
Здравствуйте! Недавно на собеседовании задавали такую задачу: какие значения последовательно получают i и s по мере выполнения...

Алгоритм для вызова методов с массива
Заранее извините за возможную не точною формулировку допустим.. у меня есть массив экземпляров класса Student у каждого студента есть...

Каков приоритет вызова методов в приведенном коде?
public void test(){} public void test(int i=0){} test(); Какой метод будет вызван? В случае с конструкторами класса какой...

Нужно ли предупреждать программистов о необходимости вызова критических методов?
Здравствуйте. Интересует следующий вопрос. Есть ли возможность предупредить того, кто расширяет функционал приложения с моими исходниками...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru