Ho una sequenza di funzioni che sono molto simili, ma per una singola linea, come i seguenti due (ma ho molti più di essi):Passando un delegato con due parametri in funzione parametro
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;
}
stavo pensando di utilizzare delegati per eliminare questa ripetizione nel codice in qualche modo elegante, che avrebbe permesso di invoco qualcosa come:
HowManyDaysInTheFirstPeriod(
samples,
delegate(DateTime d1, DateTime d2) { return d1.Month == d2.Month; });
dichiarando in tal modo un delegato come la seguente:
delegate bool DateComparer(DateTime first, DateTime second);
e dove HowManyDaysInTheFirstPeriod whould essere qualcosa di simile a quanto segue:
private static int HowManySamplesInFirstPeriod
IList<T> samples,
DateComparer comparer)
{
DateTime firstDate = samples[0].Date;
int count = 0;
while (count < samples.Count && comparer())
{
count++;
}
}
Purtroppo, il compilatore si lamenta che di confronto ha bisogno di due parametri.
Sono relativamente nuovo a C# e colpisco un blocco stradale qui. Come risolverebbe questo?
BTW, per qualcuno che dice che sono abbastanza nuovo di C#, questo è un uso molto ragionevole dei delegati. Complimenti a te per aver individuato la ripetizione e averla trasformata in un delegato. –