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 1168 Точки
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 Trainer 6849 Точки

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

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

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

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

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

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

 

0
14/01/2016 14:35:19
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.