C#/LINQ

[C#]LINQ 평균 구하기 - Average 메서드

DevStory 2022. 7. 31.

Average 메서드

C#의 LINQ에서는 집계 함수를 제공합니다. 그중 Average() 메서드는 컬렉션과 같은 집합에서 숫자 타입인 값의 평균을 계산하기 위해 사용됩니다.


메서드 오버로드

System.Linq의 Enumerable 클래스를 살펴보면 Average() 메서드가 오버로드된 다양한 버전의 메서드를 확인할 수 있습니다.

Average() 메서드는 숫자 타입인 값의 평균을 계산하므로 nullable 또는 double, float, decmial 타입의 값을 반환할 수 있습니다.

 

그리고 Func 대리자를 매개변수로 가지는 메서드와 가지지 않는 메서드가 존재합니다. 이번 포스팅에서 Func 대리자를 매개변수로 가지는 메서드와 가지지 않는 메서드 사용 방법을 예제를 통해 설명하며, Func 대리자에 대한 세부적인 내용은 아래 포스팅에서 확인할 수 있습니다.

 

[C#]람다식, 람다표현식(Lambda expression)

람다식(Lambda expression)이란? 람다식(Lambda)식은 접근자, 함수 이름, return문이 없는 익명 함수(anonymous function)입니다. 람다식을 사용하면 더 짧은 코드를 작성할 수 있으며 코드를 더 가독성 있게 만

developer-talk.tistory.com


예제 1. int 타입의 List

다음 예제는 int 타입의 List에서 평균값을 계산합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      1, 2, 3, 4, 5, 6
    };

    // 1. 질의 구문(Query Syntax)
    var linqQueryResult = (from   num in intList
                           select num).Average();

    // 2. 메서드 구문(Method Syntax)
    var linqMethodResult = intList.Average();

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 결과: " + linqQueryResult);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 결과: " + linqMethodResult);
  }
}

[실행 결과]

질의 구문
질의 구문 결과: 3.5

메서드 구문
메서드 구문 결과: 3.5

참고로 Average() 메서드는 질의 구문에서 지원하지 않으므로 질의 구문에서 평균값을 구해야 하는 경우 메서드 구문과 혼합해서 사용해야 합니다.


예제 2. Where절을 사용하는 int 타입의 List

다음 예제는 int 타입의 List에서 10보다 큰 요소들의 평균값을 계산합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>()
    {
      5, 7, 10, 12, 15
    };

    // 1. 질의 구문(Query Syntax)
    var linqQueryResult = (from   num in intList
                           where  num > 10
                           select num).Average();

    // 2. 메서드 구문(Method Syntax)
    var linqMethodResult = intList.Where(item => item > 10).Average();

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 결과: " + linqQueryResult);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 결과: " + linqMethodResult);
  }
}

[실행 결과]

질의 구문
질의 구문 결과: 13.5

메서드 구문
메서드 구문 결과: 13.5

예제 3. 사용자 정의 클래스

다음 예제는 사용자 정의 클래스인 Person 타입의 List에서 Money 프로퍼티의 평균값을 계산합니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
  public int Money { get; set; }
} 

class Program
{
  static void Main(string[] args)
  {
    List<Person> personA = new List<Person>
    {
      new Person{Name ="Bob",  Age = 20, Money = 30000},
      new Person{Name ="Nick", Age = 30, Money = 50000},
      new Person{Name ="Tom",  Age = 40, Money = 80000}
    };

    // 1. 질의 구문(Query Syntax)
    var linqQueryResult = (from   person in personA
                           select person).Average(item => item.Money);

    // 2. 메서드 구문(Method Syntax)
    var linqMethodResult = personA.Average(item => item.Money);

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 결과: " + linqQueryResult);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 결과: " + linqMethodResult);
  }
}

[실행 결과]

질의 구문
질의 구문 결과: 53333.333333333336

메서드 구문
메서드 구문 결과: 53333.333333333336

사용자 정의 클래스 타입인 데이터 집합에서 Average() 메서드를 호출하는 경우 Func 대리자를 매개변수로 전달합니다. 위 예제에서는 Money 프로퍼티만 추출하는 Func 대리자를 람다식으로 전달하였으며, 아래 사진을 보면 Func 대리자를 매개변수로 가지는 Average() 메서드가 호출되는 것을 확인할 수 있습니다.


예제 4. Where절과 사용자 정의 클래스

다음 예제는 Age 프로퍼티의 값이 15보다 큰 사람들의 평균 금액을 계산합니다.

public class Person
{
  public string Name { get; set; }
  public int Age { get; set; }
  public int Money { get; set; }
} 

class Program
{
  static void Main(string[] args)
  {
    List<Person> personA = new List<Person>
    {
      new Person{Name ="Bob",  Age = 20, Money = 30000},
      new Person{Name ="Nick", Age = 30, Money = 50000},
      new Person{Name ="Tom",  Age = 40, Money = 80000}
    };

    // 1. 질의 구문(Query Syntax)
    var linqQueryResult = (from   person in personA
                           where  person.Age > 15
                           select person).Average(item => item.Money);

    // 2. 메서드 구문(Method Syntax)
    var linqMethodResult = personA
                .Where(item => item.Age > 15)
                .Average(item => item.Money);

    Console.WriteLine("질의 구문");
    Console.WriteLine("질의 구문 결과: " + linqQueryResult);

    Console.WriteLine("\n메서드 구문");
    Console.WriteLine("메서드 구문 결과: " + linqMethodResult);
  }
}

[실행 결과]

질의 구문
질의 구문 결과: 53333.333333333336

메서드 구문
메서드 구문 결과: 53333.333333333336
반응형

댓글