공부/C#

[C#/LINQ]First vs. FirstOrDefault

개발의 피 2023. 12. 10. 16:25

첫 번째 값 / 첫 번째 값 혹은 기본값

메소드 이름 그대로의 뜻은 대충 알고 있지만, 확실히는 몰랐던 부분...! 

 

출처: C# 코딩의 기술: 실전편 - 3.1 First와 FirstOrDefault 중 선택은?

 


두 메소드를 바라봐야하는 관점 : '어느 쪽이 맞는가' (x), '적재적소에 사용하는 것' (o)

+) Last vs. LastOrDefault, Single vs. SingleOrDefault도 같은 차이! 

  First FirstOrDefault
공통점  순서가 첫번 째인 요소를 가져온다
글자 수 5글자 14글자 (쓰기도 어렵고, 읽기도 어려움)

이것까지 비교항목에 넣어야하나 싶었지만,
책에서 글자수의 차이는 중요한 사항이라고 얘기하고 있음
첫 번째 요소가 없을 때, 예외 발생 (무거운 처리 -> 피하는 것이 좋음) 기본값(참조 형식이면 null)을 반환
사용할 경우 첫 번째 값에 해당하는 요소가 있는지 아는 경우

(첫 번째 요소가 없는 것이 발생하지 않는 경우라면,
남은 차이점은 메소드의 글자 수 밖에 없고
글자 수가 적은 쪽이 편리 = First가 유리) 
조건에 맞는 문자를 찾지 못하는 경우가 자주 있을 때
(= 요소가 없을 가능성이 있다면)

 

* Default(): 확실하게 요소가 존재한다는 것을 아는 경우 ( = 예외 문제를 무시해도 되는 경우)

using System;
using System.Linq;

class Program
{
    public static void Main(string[] args)
    {
        for (; ; )
        {
            var s = Console.ReadLine();
            if (string.IsNullOrEmpty(s)) return;
            Console.WriteLine("이름의 첫 번째 글자는 {0}입니다.", s.First());
        }
    }

 

예외가 발생하지 않는 이유)

IsNullOrEmpty -> First 메소드로 불러올 수 있는 문자가 없을 때, 루프를 끝내고(=예외가 발생하지 않고) 프로그램을 종료

 

예문은 IsNullOrEmpty를 사용했지만, 코드에서 null처리를 해주는 것도 동일하게 예외가 발생하지 않는 경우로 봐도 될 것 같다! 

동일한 코드를 null처리로 바꿔본다면 

for (; ; )
{
    var s = Console.ReadLine();
    if (s != "")
    {
    	Console.WriteLine("이름의 첫 번째 글자는 {0}입니다.", s.First());
        return;
    }
}

 

이 될 수 있을 것이다 

 

cf. 문자열 != "" vs string.IsNullOrEmpty(문자열)

  문자열 != "" string.IsNullOrEmpty(문자열) string.IsNullOrWhiteSpace(문자열)
확인 문자열이 빈 문자열인지만 확인 문자열이 빈 문자열인지,
null 인지 확인
문자열이 빈 문자열인지,
null 인지,
공백 문자인지 확인
(IsNullOrEmpty 검사 확장)
true 반환 경우 문자열인 null인 경우 문자열이 null이거나
빈 문자열("")인 경우
문자열이 null이거나
공백 문자만 포함하는 경우
NullReferenceException 발생 가능 발생 x

 

* FirstOrDefault(): 조건에 맞는 문자가 없을 가능성이 있는 경우

using System;
using System.Linq;

class Program
{
    public static void Main(string[] args)
    {
        for (; ; )
        {
            var s = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(s)) return;

            var ch = s.FirstOrDefault(c => char.IsNumber(c));
            if (ch == default(char))
                Console.WriteLine("없어요");
            else
                Console.WriteLine("이름에 있는 첫 번째 숫자 {0}입니다.", ch);
        }
    }
}

조건에 맞는 첫 번째 값이 없는 경우, 기본값으로 설정해둔 "없어요"를 출력 

즉, 주어진 조건과 일치하지 않는 경우를 처리하는 안전한 방법을 제공하는 것으로 볼 수 있다. (= 예외를 방지하는 방법!)

 

'공부 > C#' 카테고리의 다른 글

[C#]클래스 vs. 구조체  (0) 2023.12.18
[C#/궁금증]기본 데이터 형식(15가지)는 전부 값형식일까?  (0) 2023.12.17
[C#]if문 vs switch문  (1) 2023.12.05
[C#]var 사용법  (1) 2023.11.29
[C#]readonly vs. const  (1) 2023.11.27