Passage d'un délégué avec deux paramètres en tant que paramètre de la fonction
J'ai une suite de fonctions qui se ressemblent beaucoup, mais pour une seule ligne, comme les deux suivants (mais j'ai beaucoup plus d'entre eux):
private static int HowManyHoursInTheFirstYear(IList<T> samples)
{
DateTime firstDate = samples[0].Date;
int count = 0;
while (count < samples.Count &&
samples[count].Date.Year == firstDate.Year)
{
count++;
}
return count;
}
private static int HowManyDaysInTheFirstMonth(IList<T> samples)
{
DateTime firstDate = samples[0].Date;
int count = 0;
while (count < samples.Count &&
samples[count].Date.Month == firstDate.Month) //<--- only change!
count++;
}
return count;
}
Je pensais à l'aide de délégués pour supprimer cette répétition dans le code, dans certains de manière élégante, qui m'aurait permis d'invoquer quelque chose comme:
HowManyDaysInTheFirstPeriod(
samples,
delegate(DateTime d1, DateTime d2) { return d1.Month == d2.Month; });
ainsi déclare un délégué comme suit:
delegate bool DateComparer(DateTime first, DateTime second);
et où HowManyDaysInTheFirstPeriod devait être quelque chose comme ce qui suit:
private static int HowManySamplesInFirstPeriod
IList<T> samples,
DateComparer comparer)
{
DateTime firstDate = samples[0].Date;
int count = 0;
while (count < samples.Count && comparer())
{
count++;
}
}
Malheureusement, le compilateur se plaint que comparer a besoin de deux paramètres.
Je suis relativement nouveau à C# et a frappé un barrage routier ici.
Comment voulez-vous résoudre ce problème?
- BTW, pour quelqu'un qui dit qu'ils sont assez nouveau pour le C#, c'est un très judicieux d'utiliser des délégués. Bravo à vous pour repérer la répétition et de l'affacturage dans un délégué.
Vous devez vous connecter pour publier un commentaire.
Vous y êtes presque! Le
comparer
délégué paramètre est juste comme toute autre fonction: Vous avez encore besoin de passer des arguments appropriés pour l'appeler. Dans votre cas, qui va signifier ce changement:(Notez également que
samples
devrait probablement êtresamples.Count
, comme je l'ai écrit ci-dessus.)Vous pouvez le faire un peu plus simple. Simplement fournir la fonction d'un délégué des extraits de ce que devrait être comparés d'un DateTime:
et il peut alors être appelé comme tel:
La
(dt) => dt.year
syntaxe peut être nouveau pour vous, mais c'est une façon plus propre de l'écriture", un délégué anonyme qui prend un objet dt de certains de type générique, et renvoie dt.l'année".Vous pourriez écrire un ancien délégué à la place, mais c'est plus agréable. 🙂
Nous pouvons le rendre un peu plus général que celui si, en ajoutant un paramètre de type générique:
Comme d'habitude si, LINQ fournit une plus belle encore alternative:
Vous avez besoin de passer l'comparer les deux dates en question. C'est probablement s'avance aussi simple que:
Ou vous pouvez les passer dans l'autre sens (c'est à dire
firstDate
et puissamples[count].Date
).Je pense que jalf.com la réponse doit être légèrement modifié pour s'adapter à l'utilisation originale:
Appel à l'aide:
Vous avez besoin pour passer les dates d'être comparé à un délégué. Donc: