LINQ의 First() vs FirstOrDefault() 차이 이해하기

LINQ에서 컬렉션의 첫 번째 요소를 가져올 때 사용하는 메서드로
**First()**와 **FirstOrDefault()**가 있습니다.
둘 다 비슷하지만, 데이터가 존재하지 않을 때의 동작이 다릅니다.
First(): 조건을 만족하는 요소가 없으면 예외(InvalidOperationException) 발생
FirstOrDefault(): 조건을 만족하지 않으면 기본값(default)을 반환 (null 또는 값형의 0, false 등)
실무에서 “없을 수도 있는 데이터”를 다룰 땐 FirstOrDefault()를 사용하는 것이 안전합니다.
using System;
using System.Linq;
using System.Collections.Generic;
class Program
{
static void Main()
{
List<string> names = new List<string> { "Alice", "Bob", "Charlie" };
// 조건을 만족하는 첫 번째 항목
string found = names.First(n => n.StartsWith("B"));
Console.WriteLine($"[First] 결과: {found}");
// 조건을 만족하지 않는 경우
try
{
string notFound = names.First(n => n.StartsWith("Z"));
Console.WriteLine($"[First] 결과: {notFound}");
}
catch (InvalidOperationException ex)
{
Console.WriteLine($"[First] 예외 발생: {ex.Message}");
}
// 안전한 버전
string safeResult = names.FirstOrDefault(n => n.StartsWith("Z"));
Console.WriteLine($"[FirstOrDefault] 결과: {(safeResult ?? "null")}");
}
}
실행 결과
[First] 결과: Bob
[First] 예외 발생: 시퀀스에 일치하는 요소가 없습니다.
[FirstOrDefault] 결과: null
First()는 반드시 조건을 만족하는 데이터가 존재해야 합니다.
FirstOrDefault()는 없을 경우 타입의 기본값을 반환합니다.
참조형 → null
값형 → 0, false, DateTime.MinValue 등
First()를 사용할 때는 Any()로 미리 존재 여부를 확인하는 것이
안전합니다.
if (names.Any(n => n.StartsWith("Z")))
Console.WriteLine(names.First(n => n.StartsWith("Z")));
else
Console.WriteLine("조건에 맞는 데이터 없음");
DB 조회 시 예외 방지: FirstOrDefault() 사용
필수 데이터 보장 로직: First() + try/catch 또는 Debug.Assert()
Null 가능성 주의: ?. 연산자 또는 null 병합(??)을 함께 사용
var user = users.FirstOrDefault(u => u.Id == id)?.Name ?? "Unknown";

#csharp #C# #csharpLINQ #csharpFirst #csharpFirstOrDefault #csharp예외처리
#csharpList #csharpNullHandling #csharp베스트프랙티스 #csharp코딩규칙
'CSharp > CSharp 문법' 카테고리의 다른 글
| foreach vs for — 성능과 사용 목적 비교 (0) | 2025.10.24 |
|---|---|
| record struct로 불변 값 타입(Value Type) 안전하게 설계하기 (0) | 2025.10.22 |
| nullable reference type으로 null 안정성 높이기 (0) | 2025.10.17 |
| HashSet<T>와 Dictionary<TKey,TValue>로 빠른 조회 성능 확보하기 (0) | 2025.10.02 |
| 효율적인 예외 처리와 ThrowHelper 패턴 (0) | 2025.09.30 |
댓글