0
votes

Éviter le prédicat en C #

Eh bien, j'ai ce code C #:

var searchTerm = search_box.Text;

Predicate<object> firstName = delegate (object pers) 
{
    var person = pers as Person;
    return person.Firstname.StartsWith(searchTerm); 
};

Predicate<object> lastName = delegate (object pers) 
{
    var person = pers as Person;
    return person.Lastname.StartsWith(searchTerm); 
};

Donc le principal problème dans ce code est que je ne veux pas utiliser Predicate . Existe-t-il un autre moyen possible d'obtenir le même résultat que le code avec Predicate


6 commentaires

Ne pourriez-vous pas les remplacer par des fonctions? Voir docs.microsoft.com/en -us / dotnet / api /…


Est-ce possible avec une boucle for?


La méthode la plus moderne serait Func firstName = pers => (pers as Person) .FirstName.StartsWith (searchTerm);


D'où obtenez-vous l'objet de toute façon


stackoverflow.com/questions/1710301/what- est-un-prédicat-en-c


Peut-être devriez-vous expliquer pourquoi vous ne souhaitez pas utiliser de prédicat. Quel est votre but et pourquoi le prédicat ne convient-il pas à cette tâche? Une fois que vous faites cela, nous n'avons pas besoin de deviner ce que vous faites et une solution spécifique pourrait être la meilleure. Peut-être que le chaînage des requêtes linq serait une «meilleure» façon de procéder.


3 Réponses :


3
votes

Pour commencer, vous pouvez simplifier la version avec Predicate:

public delegate bool SetName(object pers);
//...

SetName firstName = pers => 
{
    var person = pers as Person;
    return person.Firstname.StartsWith(searchTerm); 
};

SetName lastName = pers =>  
{
    var person = pers as Person;
    return person.Lastname.StartsWith(searchTerm); 
};

puis vous pouvez la remplacer par Func :

XXX

ou utiliser des fonctions locales (version C #> = 7.0):

bool firstName(object pers) 
{
    var person = pers as Person;
    return person.Firstname.StartsWith(searchTerm); 
};

bool lastName(object pers) 
{
    var person = pers as Person;
    return person.Lastname.StartsWith(searchTerm); 
};

ou utiliser son propre délégué :

Func<object, bool> firstName = pers =>
{
    var person = pers as Person;
    return person.Firstname.StartsWith(searchTerm); 
};

Func<object, bool> lastName = pers =>
{
    var person = pers as Person;
    return person.Lastname.StartsWith(searchTerm); 
};


2 commentaires

delegate (object pers) peut être simplifié en pers => car le compilateur sait déjà que l'argument est de type object et qu'une notation lambda (=>) est ici fonctionnellement équivalente à un délégué.


@ckuri vous avez tout à fait raison, j'ai juste essayé d'apporter des modifications minimes dans cet exemple



0
votes

Votre code semble aller bien, mais nous pouvons le réécrire comme ci-dessous:

var Customer=(Customer)pers ;

Predicate<Customer> predict=x=>
x.Firstname.StartsWith(searchTerm) && x.Lastname.StartsWith(searchTerm);


0 commentaires

0
votes

En supposant que:

  • votre question porte sur ICollectionView.Filter
  • et vous devez effectuer une recherche en utilisant à la fois le prénom et le nom
  • et Prénom et / ou Nom peuvent être null

votre code pourrait être réécrit comme ceci:

var searchTerm = search_box.Text;

yourCollectionView.Filter = obj =>
    obj is Person p &&
    (p.Firstname?.StartsWith(searchTerm) == true || 
     p.Lastname?.StartsWith(searchTerm) == true);

Ceci, bien sûr, utilise Predicate , puisque Filter propriété déclarée comme étant Predicate , mais vous ne la déclarez pas explicitement.


0 commentaires