2014-04-21 2 views
2

мне было интересно, что было бы лучшим способом для поиска по коллекции с этим форматом:Лучший алгоритм для возраста?

public class Person 
{ 
    public DateTime Birthdate {get; set;} 
} 

У меня есть дата рождения, IE 10/10/1943, теперь давайте предположим, что у меня есть метод, который принимает два параметра как это:

public IEnumerable<Person> SearchByAgeRange(int AgeMin, int AgeMax) 
{ 
    //Best algorithm goes here. 
} 

вопрос заключается в том, чтобы искать по коллекции Person, чтобы получить людей, чей возраст между целыми числами MAX и MIN, передаваемых в качестве параметров?

Я застреваю!

Заранее спасибо.

+0

Если ваша коллекция не будет отсортирована по дате рождения, вы просто должны 'foreach' через него и проверить каждый человек. – Blorgbeard

+0

Ну, LINQ имеет 'orderby' в C# ... –

+0

Является ли это LINQ для объектов или является подключением к базе данных? –

ответ

7

Попробуйте это:

public IEnumerable<Person> SearchByAgeRange(int AgeMin, int AgeMax) 
{ 
    // If the maximum age you are looking for is for instance 80, then you 
    // should look for dates that are greater or equal of the current datetime 
    // minus 80 years. This forms the minDate. 
    DateTime minDate = DateTimeNow.AddYears(-AgeMax); 

    // If the minimum age you are looking for is for instace 40, then you should 
    // look for dates that are less or equal of the current date minus 40 years. 
    // This forms the maxDate. 
    DateTime maxDate = DateTimeNow.AddYears(-AgeMin); 

    return Persons.Where(x => x.Birthdate >= minDate && x.BirthDate <= maxDate); 
} 

Я полагаю, что Persons представляет собой совокупность всех лиц, у вас есть.

+1

+1 не нужно конвертировать каждый док в возраст ... просто преобразуйте возрастной диапазон в диапазон дат. – dotjoe

+0

@dotjoe спасибо, чувак! – Christos

+0

Безупречный. Работал так очарован. – MRFerocius

6

Прежде всего, вам нужно выяснить, как рассчитать возраст, используя день рождения и текущую дату.

public static int GetAge(DateTime birthDate) 
{ 
    // your age logic goes here 
} 

Затем вы можете использовать LINQ для фильтрации коллекции:

return from p in people 
     let age = GetAge(p.Birthdate) 
     where age >= AgeMin && age <= AgeMax 
     select p; 
+0

Да, это может быть хорошей идеей сделать его частью класса «Личность». Тем не менее, я действительно надеюсь, что вы имели в виду * readonly свойство *, а не * abstract * :) – MarcinJuraszek

+0

Ах да, только не абстрактно. Я смущаюсь. На мой взгляд, 'abstract' означает нечто иное, чем в C#. – mason

+0

+1 для пользовательской логики для GetAge, поскольку иногда необходимо знать, «сколько лет было пациенту, когда он был обследован в прошлый раз», а DateTimeNow не имеет никакого смысла в этом случае – xmojmr

2
public IEnumerable<Person> SearchByAgeRange(this IEnumerable<Person> personCollection, int AgeMin, int AgeMax) 
{ 
    return personCollection.Where(c=> { 
     var currentAge =(((DateTime.Now - c.Birthdate).TotalDays+1)/365.25); 
     return currentAge > AgeMin && currentAge<AgeMax; 
    }); 
} 
Смежные вопросы