Передача делегата с двумя параметрами как функция параметра

Не уверен, является ли это вопросом для Unix & amp; Linux stackexchange. Это больше похоже на общий вопрос программирования.

Тем не менее, я бы посоветовал вам изучить использование pandas.

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

import pandas as pd
df = pd.read_csv('/tmp/samplefile.csv',sep='\t')

Если вы знаете, что startpos всегда будет меньше, чем endpos, вы можете найти вывод, который вы ' ищите, взяв максимум df['startpos'] и минимум df['endpos'].

23
задан svick 11 June 2012 в 15:26
поделиться

5 ответов

Вы почти там! comparer параметр делегата точно так же, как любая другая функция: все еще необходимо передать соответствующие аргументы для вызова его. В Вашем случае это собирается означать это изменение:

while (count < samples.Count && comparer(samples[count].Date, firstDate))
{
    count++;
}

(Кроме того, отметьте это samples должен, вероятно, быть samples.Count, поскольку я записал выше.)

14
ответ дан 29 November 2019 в 02:49
поделиться

Можно сделать это немного более простой. Просто предоставьте функции делегата, который извлекает то, что должно быть сравнено от DateTime:

private static int HowManySamplesInFirstPeriod<T>
    IList<T> samples,
    Func<DateTime, int> f // a function which takes a DateTime, and returns some number
{
    DateTime firstDate = samples[0].Date;
    int count = 0;

    while (count < samples && f(samples[count].Date) == f(firstDate))
    {
        count++;
    }
}

и это можно затем назвать как таковым:

HowManySamplesInFirstPeriod(samples, (dt) => dt.Year); // to get the year
HowManySamplesInFirstPeriod(samples, (dt) => dt.Month); // to get the month

(dt) => dt.year синтаксис может быть в новинку для Вас, но это - более чистый способ записать "анонимному делегату, который берет объект dt некоторого универсального типа и возвращает dt.year". Вы могли записать старомодному делегату вместо этого, но это более хорошо.:)

Мы можем сделать это немного более общим, чем это хотя путем добавления другого универсального параметра типа:

private static int HowManySamplesInFirstPeriod<T, U>
    IList<T> samples,
    Func<DateTime, U> f // Let's generalize it a bit, since the function may return something other than int (some of the DateTime members return doubles, as I recall)

Как обычно, хотя, LINQ обеспечивает более хорошее, все еще альтернативное:

private static int HowManySamplesInFirstPeriod<T>
    IList<T> samples,
    Func<DateTime, int> f)
{
  var firstVal = f(samples.First().Date);
  return samples.Count(dt => f(dt.Date) = firstVal)
}
6
ответ дан 29 November 2019 в 02:49
поделиться

Необходимо передать компаратор эти две рассматриваемых даты. Это - вероятно, выступы, столь же простые как:

private static int HowManySamplesInFirstPeriod
    IList<T> samples,
    DateComparer comparer)
{
    DateTime firstDate = samples[0].Date;
    int count = 0;

    while (count < samples.Count 
           && comparer(samples[count].Date, firstDate))
    {
        count++;
    }
}

Или можно хотеть передать их наоборот (т.е. firstDate и затем samples[count].Date).

4
ответ дан 29 November 2019 в 02:49
поделиться

Я думаю, что потребности ответа jalf изменяются немного для установки исходному использованию:

private static int HowManyHoursInTheFirstYear(IList<DateTime> samples, Func<DateTime, DateTime, bool> comparer) 
{ 
    DateTime firstDate = samples[0].Date; 
    int count = 0;
    while (count < samples.Count && comparer(samples[count], firstDate) ) {
        count++;
    } 
    return count; 
}

Использование вызова:

HowManyDaysInTheFirstPeriod(samples, (d1, d2) = > { return d1.Month == d2.Month; });
HowManyDaysInTheFirstPeriod(samples, (d1, d2) = > { return d1.Year == d2.Year; });
1
ответ дан 29 November 2019 в 02:49
поделиться

Необходимо передать даты, сравнивающиеся с делегатом. Так:

comparer(samples[count].Date, firstDate)
0
ответ дан 29 November 2019 в 02:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: