Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 1
Регистрация: 10.02.2013
Сообщений: 21
1
.NET 4.x

Создание расширенных методов для любой коллекции, делегаты

03.05.2013, 16:05. Показов 934. Ответов 1
Метки нет (Все метки)

Нужна скорая помощь!)
У меня вот такой класс:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
using System;
using System.Text;
 
namespace ConsoleApplication1
{
    public static class Functions
    {
        public static bool IsEven(int a)
        {
            return a % 2 == 0;
        }
 
        public static bool IsOdd(int a)
        {
            return a % 2 != 0;
        }
 
        public static int max(this int[] arr, del dl = null)
        {
            int max=arr[0];
            if (dl != null)
            {
                foreach (int item in arr)
                    if (dl(item))
                        if (!dl(max) || max < item)
                            max = item;
 
                if (!dl(max))
                    throw new Exception("No specified type of elements");
            }
            else
                foreach (int item in arr)
                    if (max < item)
                        max = item;
            return max;
        }
    }
}


и такая программа:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
using System;
using System.Collections.Generic;
 
using System.Text;
 
namespace ConsoleApplication1
{
    public delegate bool del(int a);
    class Program
    {
        static void Main(string[] args)
        {
            del IsEven = Functions.IsEven;
            del IsOdd = Functions.IsOdd;
           
            int[] a = new int[]{32492435,431,534,623,44,999};
            Console.WriteLine(a.max());
            Console.WriteLine(a.max(IsEven));
            Console.WriteLine(a.max(IsOdd));
        }
 
    }
}
Расширенный метод max работает с массивами типа int, а нужно, чтобы он работал со всеми коллекциями(IEnumerable). С перегрузками получается, но код длинный, подскажите короткий вариант этой функции)

И нужна функция T Select(bool condition, T item), которая возвращает коллекцию тех элементов из заданной коллекции, которые соответствуют условию.

P.S. я преднамеренно удалила System.Linq, нам задали писать свои функции : D
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.05.2013, 16:05
Ответы с готовыми решениями:

Делегаты, интерфейсы и коллекции
Уважаемые пользователи,очень прошу помочь в реализации экзамена... Проект сохранить под именем...

Рисование в форме, передача методов класса классу формы используя делегаты
Всем доброй ночи!) Решив данный вопрос , решится большая задача, суть которой заключается в том,...

Создание коллекции для последующей обработки
Доброго времени суток, уважаемые форумчане. Подскажите, каким образом лучше написать метод по...

Динамическое создание типа для коллекции
Здравствуйте! Есть такая задумка, но не знаю как реализовать. Файл электронной таблицы, в...

1
228 / 95 / 27
Регистрация: 16.04.2013
Сообщений: 315
Записей в блоге: 2
03.05.2013, 18:33 2
ну вот для Max, а дальше собственно по аналогии можно сделать
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public static class Functions
    {
        public static T Max<T>(this IEnumerable<T> source)
        {
            if (source == null)
                throw new ArgumentNullException("source");
            Comparer<T> comparer = Comparer<T>.Default;
            T max = default(T);
            if (max == null)
            {
                foreach (T s in source)
                    if ((s != null) && ((max == null) || (comparer.Compare(s, max) > 0)))
                        max = s;
                return max;
            }
            bool flag = false;
            foreach (T s in source)
            {
                if (flag)
                {
                    if (comparer.Compare(s, max) > 0)
                        max = s;
                }
                else
                {
                    max = s;
                    flag = true;
                }
            }
            if (!flag)
            {
                throw new Exception("No Elements");
            }
            return max;
        }
Добавлено через 7 минут
или вот так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
 public static class Functions
    {
 
        public static T Max<T>(this IEnumerable<T> source, IComparer<T> comparer = null)
        {
            if (source == null)
                throw new ArgumentNullException("source");
            comparer = comparer ?? Comparer<T>.Default;
            return Max(source, comparer.Compare);
        }
 
        public static T Max<T>(this IEnumerable<T> source, Comparison<T>  cmp)
        {
            if (source == null)
                throw new ArgumentNullException("source");
            if(cmp == null)
                throw new ArgumentNullException("cmp");
            T max = default(T);
            if (max == null)
            {
                foreach (T s in source)
                    if ((s != null) && ((max == null) || (cmp(s, max) > 0)))
                        max = s;
                return max;
            }
            bool flag = false;
            foreach (T s in source)
            {
                if (flag)
                {
                    if (cmp(s, max) > 0)
                        max = s;
                }
                else
                {
                    max = s;
                    flag = true;
                }
            }
            if (!flag)
            {
                throw new Exception("No Elements");
            }
            return max;
        }
 
    }
Добавлено через 4 минуты
Цитата Сообщение от sweetguru Посмотреть сообщение
И нужна функция T Select(bool condition, T item), которая возвращает коллекцию тех элементов из заданной коллекции, которые соответствуют условию
согласно заданию должен быть не select, а where ну и сигнатура метода, что-то совсем странная: где тут коллекция и что значит параметр item?.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.05.2013, 18:33

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Создание собственных методов для встроенных обьектов
У всех встроенных объектов JavaScript есть свои свойства и методы. Например, у объекта Array есть...

Создание отчетов для любой выбранной пользователем БД
программа работает с базами данных access, пользователь сам выбирает бд. необходимо что бы...

Написать unit тест с заглушками на любой из методов
Помогите пожалуйста написать unit тест с заглушками на любой из методов. Буду признателен ...

Реализовать ввод исходных данных, расчет и вывод данных в виде методов класса. В Main только создание объектов и вызов методов
Всем привет) помогите пожалуйста с заданием &quot;Реализовать ввод исходных данных, расчет и вывод...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.