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
3 Réponses :
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);
};
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
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);
En supposant que:
ICollectionView.Filter 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.
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
FuncD'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.