Не уверен, является ли это вопросом для Unix & amp; Linux stackexchange. Это больше похоже на общий вопрос программирования.
Тем не менее, я бы посоветовал вам изучить использование pandas
.
Вы можете импортировать файл примера в виде кадра данных, указав схему вкладки следующим образом:
import pandas as pd
df = pd.read_csv('/tmp/samplefile.csv',sep='\t')
Если вы знаете, что startpos всегда будет меньше, чем endpos, вы можете найти вывод, который вы ' ищите, взяв максимум df['startpos']
и минимум df['endpos']
.
Вы почти там! comparer
параметр делегата точно так же, как любая другая функция: все еще необходимо передать соответствующие аргументы для вызова его. В Вашем случае это собирается означать это изменение:
while (count < samples.Count && comparer(samples[count].Date, firstDate))
{
count++;
}
(Кроме того, отметьте это samples
должен, вероятно, быть samples.Count
, поскольку я записал выше.)
Можно сделать это немного более простой. Просто предоставьте функции делегата, который извлекает то, что должно быть сравнено от 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)
}
Необходимо передать компаратор эти две рассматриваемых даты. Это - вероятно, выступы, столь же простые как:
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
).
Я думаю, что потребности ответа 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; });
Необходимо передать даты, сравнивающиеся с делегатом. Так:
comparer(samples[count].Date, firstDate)