Софтуерно Инженерство
Loading...
simeon_petrov avatar simeon_petrov 45 Точки

Как да се направи метод, който да работи с колекции от всякакъв тип данни?

Идеята ми е следната: Как може да се направи метод, който да може да разпечата не само int колекции, но и string, bool и прочее? Ето примерче, в което метода печата всякакви int колекции, но не печата string.

    class TestProgram
    {
        static void Main(string[] args)
        {
            int[] integerArray = { 1, 2, 3 };
            List<int> integerList = new List<int> { 4, 5, 6 };
            List<string> stringList = new List<string> { "a", "b", "c", "d", "e" };

            PrintCollection(integerArray);
            PrintCollection(integerList);
            //PrintCollection(stringList);
        }

        private static void PrintCollection(ICollection<int> inputCollection)
        {
            foreach (var item in inputCollection)
            {
                Console.WriteLine(item);
            }
        }
    }
 

Тагове:
0
Общи приказки 14/01/2016 18:05:05
enevlogiev avatar enevlogiev 1169 Точки
public static void PrintMe<T>(this IEnumerable<T> collection)
{
    foreach (var item in collection)
    {
        Console.WriteLine(item);
    }
}

Понеже е extension, трябва да е в статичен клас. Ако не искаш да е екстеншън, махаш this-a : )

2
simeon_petrov avatar simeon_petrov 45 Точки

Благодаря на всички за отговорите! Само с IEnumerable знам, че не става, защото го пробвах вече :)

Ето така стана, по-надолу е кода, максимално опростен. Само да попитам, какво точно означава "екстеншън" и защо за да работи трябва или класът да е static, и долу пред аргумента да има this, или класът да не е статичен, и долу да няма this?

public static class TestProgram
    {
        public static void Main(string[] args)
        {
            int[] integerArray = { 1, 2, 3 };
            List<int> integerList = new List<int> { 4, 5, 6 };
            List<string> stringList = new List<string> { "a", "b", "c", "d", "e" };

            PrintCollection(integerArray);
            PrintCollection(integerList);
            PrintCollection(stringList);
        }

        private static void PrintCollection<T>(this IEnumerable<T> inputCollection)
        {
            foreach (var item in inputCollection)
            {
                Console.WriteLine(item);
            }
        }
    }

0
RoYaL avatar RoYaL SoftUni Team Trainer 6883 Точки

Като екстенжъни за коса. Удължители :D Добавяш методи към обектите от определен тип, без да модифицираш класа. За да стане това обаче C# са измислили, че класът и методите трябва да са статични и за да анотираш на обектите от кой тип ще правиш "удължаване" тряба да сложиш "this" пред типа.

Ти в момента не ги ползваш като екстеншън методи. Екстеншън методите се ползват върху обектите от тоя тип, а не се подават като параметър.

Много по-лесно ще стане ако напишеш в гугъл extension methods и четеш.

2
nikola.m.nikolov avatar nikola.m.nikolov 832 Точки

Както Royal спомена хем си създал extension метод, хем не го използваш... На всяка инстанция от тип IEnumerable се закача метода PrintCollection, така че за да го използваш може просто да използваш:

integerArray.PrintCollection();
integerList.PrintCollection();
stringList.PrintCollection();

 

0
14/01/2016 14:35:19