.NET 4.x Создание расширенных методов для любой коллекции, делегаты - C#

Узнай цену своей работы

Формулировка задачи:

Нужна скорая помощь!) У меня вот такой класс:
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;
        }
    }
}
и такая программа:
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

Решение задачи: «.NET 4.x Создание расширенных методов для любой коллекции, делегаты»

textual
Листинг программы
 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;
        }
 
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

10   голосов , оценка 4.4 из 5
Похожие ответы