C#/LINQ

[C#]LINQ 데이터 개수 구하기 - Count 메서드

DevStory 2022. 7. 31.

Count 메서드

C#의 LINQ에서 제공되는 Count() 메서드는 컬렉션과 같은 데이터 집합의 요소 개수 또는 특정 조건을 만족하는 요소 개수를 구하기 위해 사용됩니다.


메서드 오버로드

System.Linq 네임스페이스의 Enumerable 클래스에 정의된 Count() 메서드는 오버로드된 두 가지 버전의 메서드가 존재합니다.

public static int Count<TSource>(
  this IEnumerable<TSource> source, 
  Func<TSource, bool> predicate);

public static int Count<TSource>(this IEnumerable<TSource> source);

Count() 메서드 구문을 통해 IEnumerable 인터페이스의 확장 메서드라는 것을 알 수 있으며, 항상 int 타입의 값을 반환합니다. 그리고 두 가지 버전의 차이점은 매개변수로 Func 대리자 사용 여부입니다.

 

Func 대리자에 대한 자세한 내용은 아래 포스팅에서 확인할 수 있습니다.

 

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

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

developer-talk.tistory.com


예제 1. List의 요소 개수

다음 예제는 Count() 메서드를 사용하여 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).Count();

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

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

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

[실행 결과]

질의 구문
질의 구문 결과: 6

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

참고로 Count() 메서드는 질의 구문에서 사용할 수 없으므로 질의 구문에서 요소의 개수를 구해야 하는 경우 메서드 구문과 혼합하여 Count() 메서드를 사용합니다.


예제 2. 요소가 없거나 null로 초기화된 컬렉션

만약, List에 요소가 없는 경우 Count() 메서드는 0을 반환합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = new List<int>();

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

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

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

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

 [실행 결과]

질의 구문
질의 구문 결과: 0

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

 

List를 null로 초기화 후 Count() 메서드를 호출하면 런타임 에러가 발생합니다.

class Program
{
  static void Main(string[] args)
  {
    List<int> intList = null;

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

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

[에러 내용]


예제 3. Where절로 필터된 데이터의 개수

다음 예제는 Where절을 사용하여 int 타입의 List에서 4보다 큰 요소의 개수를 구합니다.

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
                           where  num > 4
                           select num).Count();

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

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

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

[실행 결과]

질의 구문
질의 구문 결과: 2

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

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

다음 예제는 사용자 정의 클래스인 Person 타입의 List에서 요소의 수를 구합니다.

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)
    int linqQueryResult = (from   person in personA
                           select person).Count();

    // 2. 메서드 구문(Method Syntax)
    int linqMethodResult = personA.Count();

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

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

[실행 결과]

질의 구문
질의 구문 결과: 3

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

예제 5. 사용자 정의 클래스와 Where절

다음 예제는 Money 프로퍼티의 값이 40000보다 큰 요소의 개수를 구합니다.

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)
    int linqQueryResult = (from   person in personA
                           where  person.Money > 40000
                           select person).Count();


    // 2. 메서드 구문(Method Syntax)
    int linqMethodResult = personA.Where(item => item.Money > 40000).Count();

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

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

[실행 결과]

질의 구문
질의 구문 결과: 2

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

예제 6. 사용자 정의 클래스와 Func 대리자

특정 조건을 만족하는 데이터 개수를 구하기 위해 Where절을 사용하지 않고 Func 대리자를 Count() 메서드의 매개변수로 전달할 수 있습니다.

 

다음 예제는 Money 프로퍼티의 값이 40000보다 큰 요소의 개수를 구하기 위해 Func 대리자를 Count() 메서드의 매개변수로 전달합니다.

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)
    int linqQueryResult = (from   person in personA
                           select person).Count(item => {
                               if (item.Money > 40000) return true;
                               else return false;
                           });


    // 2. 메서드 구문(Method Syntax)
    int linqMethodResult = personA.Count(item => {
        if (item.Money > 40000) return true;
        else return false;
    });

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

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

[실행 결과]

질의 구문
질의 구문 결과: 2

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

댓글