C # Как написать тело функции, которое можно использовать как GetAverageAge (Students, s => s.age) - PullRequest
0 голосов
/ 20 апреля 2011

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

    public class Employee
    {
        public int age { get; set; }
    }

    public class Student
    {
        public int age { get; set; }
    }

ObservableCollection<Employee> employees = ...;
ObservableCollection<Student> students = ...;

Теперь мне нужна функция для расчета среднего возраста этих коллекций:

int employeeAveAge = GetAverageAge(employees, e => e.age);
int studentAveAge = GetAverageAge(students, s => s.age);

Как написать тело функции? Я не знаком с делегатом Action / Fun, и кто-то предложил мне передать лямбду в качестве параметра функции

ну, я не использую встроенную LINQ Average (), потому что хочу узнать, как передать лямбду в функцию

Ответы [ 5 ]

3 голосов
/ 20 апреля 2011

Функция будет выглядеть примерно так (не проверено):

public int GetAverageAge<T>(IEnumerable<T> list, Func<T,int> ageFunc)
{

   int accum = 0;
   int counter = 0;
   foreach(T item in list)
   {
      accum += ageFunc(item);
      counter++;
   }

   return accum/counter;
}

Вместо этого вы можете использовать метод LINQ Average:

public int GetAverageAge<T>(IEnumerable<T> list, Func<T,int> ageFunc)
{
    return (int)list.Average(ageFunc);
}
3 голосов
/ 20 апреля 2011

Я бы полностью покончил с функцией и просто использовал бы:

int employeeAge = (int)employees.Average(e => e.age);
int studentAge = (int)students.Average(e => e.age);

Редактировать: Добавлен возврат и приведение к int (Среднее возвращает двойное).

2 голосов
/ 20 апреля 2011

Вы можете сделать что-то вроде этого:

    double GetAverageAge<T>(IEnumerable<T> persons, Func<T, int> propertyAccessor)
    {
        double acc = 0.0;
        int count = 0;
        foreach (var person in persons)
        {
            acc += propertyAccessor(person);
            ++count;
        }
        return acc / count;
    }

В качестве альтернативы рассмотрите возможность использования LINQ , она уже предоставляет что-то подобное.

0 голосов
/ 20 апреля 2011
I Would do it this way for a normal list not sure about observable collection :

       List<Employee> employees = new List<Employee>
                                       {
                                           new Employee{age = 12},
                                           new Employee{age = 14}};
        Func<List<Employee>, int> func2 = (b) => GetAverageAge(b);

private static int GetAverageAge(List<Employee> employees)
    {
        return employees.Select(employee => employee.age).Average; //Thats quicker i guess :)
    }
0 голосов
/ 20 апреля 2011

Почему бы не использовать LINQ для этого?

employees.Select(e => e.age).Average()

students.Select(s => s.age).Average()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...