Функция Generi c с типами возвращаемых контейнеров generi c с использованием оценщиков generi c - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь создать функцию, которая возвращает универсальный c тип контейнера, который принимает в качестве входных данных два других универсальных c типа контейнера с обобщенными c оценщиком (оценщиками) / делегатами.

Я хочу избежать беспорядка с большим количеством имен классов, если это возможно, но я сделаю это, если это необходимо ...

Нужно ли создавать другой (избыточный) класс generi c просто для этого?

Примечание: Мне нужно использовать Visual Studio 2013 .

Пример кода:

delegate bool MyEval1<T>(T a);
delegate bool MtEval2<T>(T a, T b);

// This does not compile...
List<T> SomeNiceFunction<T>(List<T> l1, List<T> l2, MyEval1<T> e1, MyEval2<T> e2) {
    List<T> result = new List<T>();
    foreach(var elem in l1) {
        var match = l2.FirstOrDefault(o => e1(o) && e2(o, elem));
        if (match != null)
            result.Add(match);
    }
    //... (some more code goes here)
    return result;
}

Заранее спасибо: -)

Редактировать После некоторой помощи, приведенной ниже, я могу обобщить ее следующим образом:

public static class Mumbo
{
    static List<T> Jumbo<T>(List<T> l1, List<T> l2, MyEval1<T> e1, MyEval2<T> e2) {
        List<T> result = new List<T>();
        // code goes here
        return result;
    }
}

Теперь это работает ... Спасибо: -)

Ответы [ 2 ]

3 голосов
/ 03 апреля 2020

Делегаты - это типы, а не функции. Вам нужно создать класс для SomeNiceFunction, но он не должен быть обобщенным c, только сам метод:

public static class Container {
    public static List<T> SomeNiceFunction<T>(List<T> l1, List<T> l2, MyEval1<T> e1, MyEval2<T> e2) {
    List<T> result = new List<T>();
    foreach(var elem in l1) {
        var match = l2.FirstOrDefault(o => e1(o) && e2(o, elem));
        if (match != null)
            result.Add(match);
    }
    //... (some more code goes here)
    return result;
  }
}
1 голос
/ 03 апреля 2020

Заявления делегатов не имеют тела. Вы можете объявить функцию отдельно, как показано ниже:

public class Program
{
    private static List<T> SomeNiceFunction<T>(List<T> l1, List<T> l2, MyEval1<T> e1, MyEval2<T> e2)
    {
        var result = new List<T>();
        foreach (var elem in l1)
        {
            var match = l2.FirstOrDefault(o => e1(o) && e2(o, elem));
            if (match != null)
                result.Add(match);
        }

        //... (some more code goes here)
        return result;
    }

    public static void Main(string[] args)
    {
        MyDelegate<string> d = SomeNiceFunction;
    }

    private delegate bool MyEval1<T>(T a);

    private delegate bool MyEval2<T>(T a, T b);

    private delegate List<T> MyDelegate<T>(List<T> l1, List<T> l2, MyEval1<T> e1, MyEval2<T> e2);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...