Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 쿼리 결과가 비어 있을 때 LINQ는 무엇을 반환할까?

Language-Integrated Query(LINQ)는 쿼리 기능을 C# 언어에 직접 통합하는 것을 기반으로 하는 일련의 기술을 가리키는 이름입니다.

C#에서 LINQ 쿼리를 작성하면 SQL Server 데이터베이스, XML 문서, ADO.NET DataSet은 물론, IEnumerable 또는 제네릭 IEnumerable<T> 인터페이스를 지원하는 모든 개체 컬렉션까지 다양한 데이터 소스를 대상으로 조회를 수행할 수 있습니다.

LINQ의 빈 결과 처리 방식

LINQ to SQL에서 조건에 맞는 결과가 하나도 없는 쿼리에 대해 First()나 Single() 같은 메서드로 첫 번째 요소를 가져오려고 하면 "시퀀스에 요소가 없습니다(Sequence contains no elements)"라는 예외가 발생합니다. 빈 시퀀스에서 단일 요소를 강제로 요구했기 때문입니다.

반면 ToList()를 호출하면 예외 없이 빈 리스트(empty list)를 반환합니다. 따라서 Count()는 0을 출력하고, foreach 루프는 아무 항목도 실행하지 않습니다.

참고: 예외 없이 안전하게 요소 가져오기

결과가 없을 때 예외 대신 기본값을 받고 싶다면 First() 대신 FirstOrDefault(), Single() 대신 SingleOrDefault()를 사용하세요. 참조 형식은 null을, 값 형식은 0과 같은 기본값을 반환하므로 훨씬 안전합니다.

예제 1: 문자열 컬렉션

class Program{
   public static void Main(){
      List<string> list = new List<string> { "a" };
      IEnumerable<string> ilist = list.Where(x => x == "ABC").ToList();
      System.Console.WriteLine(ilist.Count());
      foreach (var item in ilist){
         System.Console.WriteLine(item);
      }
      Console.ReadLine();
   }
}

출력

0

위 예제에서 Where 조건(x == "ABC")에 해당하는 요소가 없으므로 ToList()는 빈 리스트를 반환하고, Count()는 0을 출력합니다.

예제 2: 정수 컬렉션

class Program{
   public static void Main(){
      List<int> list = new List<int> { 1 };
      IEnumerable<int> ilist = list.Where(x => x == 3).ToList();
      System.Console.WriteLine(ilist.Count());
      foreach (var item in ilist){
         System.Console.WriteLine(item);
      }
      Console.ReadLine();
   }
}

출력

0

정수 컬렉션 역시 마찬가지입니다. 조건(x == 3)을 만족하는 요소가 없기 때문에 빈 리스트가 반환되며, 프로그램은 오류 없이 정상적으로 종료됩니다.