Я пытаюсь определить способ, где, если имя находится в списке WorkedDataPoint и попадает в любой из дней в totalDaysInDateRange, оно считает его. Основная предпосылка: если эти две даты совпадают, человек работал в тот день - я пытаюсь подсчитать количество «отработанных» дней. Также на одного пользователя может приходиться более одной записи в день, и мы можем считать только одну, одну на день, так что DistinctBy в "morelinq" показался хорошим выбором ...
То, что у меня здесь, должно работать нормально, компилятор на работе, поэтому не могу сказать наверняка. Но как бы я сделал это с помощью лямбда-выражений linq, чтобы сделать его более лаконичным - особенно цикл foreach, может ли это быть в лямбда-выражении в этом приложении как-то?
public class WorkedDatapoint
{
public string AssignerName { get; set; }
public DateTime Date { get; set; }
public bool AssignedToOther { get; set; }
}
List<DateTime> totalDaysInDateRange
List<WorkedDataPoint> AssignersList
testtech = "Bobby"
//The two lists are loaded here
int totalDaysWorked = 0;
foreach (var day in totalDaysInDateRange)
{
if (AssignersList.Where(d => testtech.Contains(d.AssignerName)).DistinctBy(d => d.Date.Date).Any(d => d.Date.Date == day.Date)
{
totalDaysWorked++;
}
}
Редактировать: Я думаю, что получил, но не могу проверить до завтра. Любой способ объявить эту переменную TotalDaysWorked встроенной или это слишком много?
int totalDaysWorked = 0;
totalDaysInDateRange.ForEach((day) =>
{
if (AssignersList
.Where(d => testtech.Contains(d.AssignerName))
.DistinctBy(d => d.Date.Date)
.Any(d => d.Date.Date == day.Date))
{ totalDaysWorked++; }});
Этот метод "хрустит" тысячами записей, поэтому мы очень ценим мысли об оптимизации для скорости (много оперативной памяти и Intel-I7).