Cả Last() và LastOrDefault() đều lấy occurrence cuối cùng của giá trị. Nhưng khác biệt chính: Last() ném exception nếu không có dữ liệu khớp criteria, trong khi LastOrDefault() trả về giá trị mặc định (null) nếu không có dữ liệu.
- Dùng
Last()khi chắc chắn sequence có ít nhất một element. - Dùng
LastOrDefault()khi không chắc về dữ liệu.
Ví dụ 1: Có dữ liệu khớp
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace ConsoleApp
{
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
class Program
{
static void Main()
{
var studentsList = new List
{
new Student { Id = 1, Name = "John" },
new Student { Id = 2, Name = "Jack" },
new Student { Id = 1, Name = "Jill" }
};
var lastOrDefaultStudent = studentsList.LastOrDefault(student => student.Id == 1);
var lastStudent = studentsList.Last(student => student.Id == 1);
Console.WriteLine($"LastOrDefault: {lastOrDefaultStudent.Id} {lastOrDefaultStudent.Name}");
Console.WriteLine($"Last: {lastStudent.Id} {lastStudent.Name}");
Console.ReadLine();
}
}
}
Kết quả
LastOrDefault: 1 Jill Last: 1 Jill
Ví dụ 2: Không có dữ liệu khớp
using System;
using System.Collections.Generic;
using System.Linq;
namespace DemoApplication
{
class Program
{
static void Main(string[] args)
{
try
{
var studentsList = new List
{
new Student { Id = 1, Name = "John" },
new Student { Id = 2, Name = "Jack" }
};
var lastOrDefaultStudent = studentsList.LastOrDefault(student => student.Id == 3);
var value = lastOrDefaultStudent == null ? "null" : "";
Console.WriteLine($"LastOrDefault: {value}");
var lastStudent = studentsList.Last(student => student.Id == 3);
}
catch (Exception ex)
{
Console.WriteLine($"Last Exception: {ex.Message}");
Console.ReadLine();
}
}
}
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
}
}
Kết quả
LastOrDefault: null Last Exception: Sequence contains no matching element
Id "3" không có trong studentsList. Do đó LastOrDefault() trả về null, còn Last() ném exception.