2 votes

Comment passer des délégués comme paramètre <T> dans une fonction ?

public delegate bool CompareValue<in T1, in T2>(T1 val1, T2 val2);
    public static bool CompareTwoLists<T1, T2>(IEnumerable<T1> list1, IEnumerable<T2> list2, CompareValue<T1, T2> compareValue)
    {
        return list1.Select(item1 => list2.Any(item2 => compareValue(item1, item2))).All(search => search)
                && list2.Select(item2 => list1.Any(item1 => compareValue(item1, item2))).All(search => search);
    }

Dans la fonction ci-dessus, comment passer "compareValue" comme paramètre lors de l'appel de la fonction "CompareTwoLists" ?

1voto

Richard Szalay Points 42486

Avec une expression lambda qui correspond au délégué :

var people = new List<Person>();
var orders = new List<Order>();

bool result = CompareTwoLists(people, orders, 
    (person, order) => person.Id == order.PersonId);

Ou comme une référence à une méthode qui correspond au délégué :

static bool PersonMatchesOrder(Person person, Order order)
{
    return person.Id == order.PersonId;
}

bool result = CompareTwoLists(people, orders, PersonMatchesOrder);

0voto

user3185569 Points 22924

Vous devez créer une méthode (normale ou anonyme) qui correspond à la signature de ce délégué. Vous trouverez ci-dessous un exemple :

var list1 = new List<string>();
var list2 = new List<int>();

CompareValue<string, int> compareValues = (x, y) => true;

CompareTwoLists(list1, list2, compareValues);

Vous pouvez également remplacer la méthode anonyme par une méthode normale :

CompareValue<string, int> compareValues = SomeComparingMethod;

static bool SomeComparingMethod(string str, int number)
{
    // code here
}

Une autre approche

Vous pouvez modifier votre méthode pour utiliser Func :

public static bool CompareTwoLists<T1, T2>(IEnumerable<T1> list1, IEnumerable<T2> list2, 
                                           Func<T1, T2, bool> compareValue)
{
    return list1.All(x => list2.Any(y => compareValue(x, y)))
        && list2.All(x => list1.Any(y => compareValue(y, x)));
}

Et changer la méthode de l'appelant en :

Func<User, Role, bool> compareValues = 
                            (u, r) => r.Active
                                   && u.Something == r.Something 
                                   && u.SomethingElse != r.SomethingElse);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X