Вызовите делегата без указания параметра делегата - PullRequest
0 голосов
/ 21 октября 2010

У меня есть две похожие функции, которые я надеюсь изменить для устранения дублирования:

IEnumerable<TotalType> GetTotalForMonths(string id, DateTime lastTotalDate)
{
    for (int i = 0; lastTotalDate.AddMonths(i + 1) <= DateTime.Now; i++)
    {
        var totalStartDate = new DateTime(lastTotalDate.AddMonths(i).Year, lastTotalDate.AddMonths(i).Month, 1);
        var totalEndDate = totalStartDate.AddMonths(1);
        var total = this.GetTotal(id, totalStartDate, totalEndDate);
        yield return new TotalType(id, total, new TimeInterval(totalStartDate, totalEndDate));
    }
}

Другой делает то же самое в течение нескольких дней. Я надеюсь передать делегата для определения конкретной продолжительности (дни, месяцы и т. Д.). Я попытался передать Func<DateTime, DateTime> addTime, что хорошо работает, за исключением того, что я не хочу указывать значение аргумента addTime.

Предложения

Ответы [ 3 ]

2 голосов
/ 21 октября 2010
var byMonths = GetTotal(123, yourDate, (d, i) => d.AddMonths(i));

var byDays = GetTotal(456, anotherDate, (d, i) => d.AddDays(i));

// ...

IEnumerable<TotalType> GetTotal(
    string id, DateTime lastTotalDate, Func<DateTime, int, DateTime> adder)
{
    for (int i = 0; adder(lastTotalDate, i + 1) <= DateTime.Now; i++)
    {
        var temp = adder(lastTotalDate, i);
        var totalStartDate = new DateTime(temp.Year, temp.Month, 1);
        var totalEndDate = adder(totalStartDate, 1);
        var total = this.GetTotal(id, totalStartDate, totalEndDate);
        var interval = new TimeInterval(totalStartDate, totalEndDate);

        yield return new TotalType(id, total, interval);
    }
}
2 голосов
/ 21 октября 2010

Я не уверен, правильно ли я понял ваш вопрос, но если вы хотите передать AddMonth метод в качестве аргумента, без указания объекта-получателя, вы можете создать лямбду:

GetTotal(id, lastDate, (dt, num) => dt.AddMonth(num))

для вызова «обобщенной» функции.

Вам необходимо объявить функцию как:

IEnumerable<TotalType> GetTotal(string id, DateTime lastTotalDate,
   Func<DateTime, int, DateTime> adder)
0 голосов
/ 23 декабря 2010

То, что вы хотите сделать, называется «карри». У меня есть шаблон, который я использую в vb.net для этой цели; Я не уверен, что это лучший шаблон, но он должен быть адаптирован к C # без особых проблем. Обратите внимание, что хотя использование лямбда-выражений ограничит ваши возможности редактирования и продолжения, использование фабрики карри не будет представлять таких ограничений.

Вот ссылка на мой вопрос: Каков наилучший шаблон для параметров делегирования карри (с использованием .NET 2.0 или более поздней версии)?

Это должно хорошо перевести на C #; всякий раз, когда вы видите круглые скобки, начинающиеся с "(Of", замените их угловыми скобками; "ByRef Foo As Bar" и "Dim Foo As Bar" оба становятся "Bar Foo".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...