검색을 위한 LINQ
Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 65번째.
챌린지
쉬움LINQ를 사용하여 도서관 시스템에 강력한 검색 기능을 추가해 봅시다! 제목으로 검색하기, 저자로 필터링하기, 대출 가능한 도서 찾기 등 다양한 기준으로 도서를 찾을 수 있는 메서드를 구현하게 됩니다. LINQ는 이러한 쿼리를 우아하고 읽기 쉽게 만들어 줍니다.
기존 프로젝트 구조를 계속해서 확장해 나갈 것입니다:
Book.cs:Id,Title,Author,IsAvailable속성과Borrow()및Return()메서드가 포함된 Book 클래스를 유지합니다.User.cs:MaxBooks,CanBorrow()및 대출 도서 관리 메서드를 포함하여 대출 추적 기능이 있는 User 클래스를 유지합니다.Library.cs: 여기에 LINQ 기반 검색 메서드를 추가합니다. 기존 대출 로직 외에도 다음 검색 기능을 구현하세요:SearchByTitle(string keyword)- 제목에 키워드가 포함된 모든 도서를 반환합니다 (대소문자 구분 없음).GetBooksByAuthor(string author)- 특정 저자의 모든 도서를 반환합니다 (정확히 일치, 대소문자 구분 없음).GetAvailableBooks()- 현재 대출 가능한 모든 도서를 반환합니다.GetBorrowedBooks()- 현재 대출 중인 모든 도서를 반환합니다.
Program.cs: 검색 쿼리를 처리하고 결과를 표시합니다.
다음과 같은 입력을 받게 됩니다:
- 도서관 이름
- 도서 수, 그 다음 각 도서 정보
id|title|author - 초기 상태 설정을 위한 대출 작업 횟수, 그 다음 각
bookId - 다음 형식 중 하나의 검색 명령:
title|keyword- 제목 키워드로 도서 검색author|name- 저자별 도서 가져오기available- 모든 대출 가능한 도서 가져오기borrowed- 모든 대출 중인 도서 가져오기
검색 결과에 대해, 일치하는 각 도서를 {Title} by {Author} 형식으로 한 줄씩 출력합니다. 일치하는 도서가 없으면 No books found를 출력합니다. 결과는 도서관 컬렉션에 나타나는 순서대로 출력되어야 합니다.
예를 들어, 입력이 다음과 같다면:
City Library
5
B001|The Hobbit|Tolkien
B002|The Lord of the Rings|Tolkien
B003|1984|George Orwell
B004|Animal Farm|George Orwell
B005|The Silmarillion|Tolkien
2
B001
B003
author|Tolkien출력은 다음과 같아야 합니다:
The Hobbit by Tolkien
The Lord of the Rings by Tolkien
The Silmarillion by Tolkien동일한 도서관 설정에서 대출 가능한 도서를 검색하는 또 다른 예시입니다:
City Library
5
B001|The Hobbit|Tolkien
B002|The Lord of the Rings|Tolkien
B003|1984|George Orwell
B004|Animal Farm|George Orwell
B005|The Silmarillion|Tolkien
2
B001
B003
available출력은 다음과 같아야 합니다:
The Lord of the Rings by Tolkien
Animal Farm by George Orwell
The Silmarillion by TolkienLINQ는 복잡한 루프가 될 수 있는 코드를 표현력 있고 읽기 쉬운 쿼리로 변환합니다. 필터링을 위한 Where() 및 결과를 구체화하기 위한 ToList()와 같은 메서드는 검색 구현을 깔끔하고 유지 관리하기 쉽게 만들어 줄 것입니다!
직접 해보기
using System;
using System.Collections.Generic;
namespace LibrarySystem
{
class Program
{
public static void Main(string[] args)
{
// 도서관 이름 읽기
string libraryName = Console.ReadLine();
// 도서관 이름으로 Library 인스턴스 생성
Library library = new Library(libraryName);
// 도서 수 읽기
int numBooks = Convert.ToInt32(Console.ReadLine());
// 도서 읽기 및 추가
for (int i = 0; i < numBooks; i++)
{
string bookInput = Console.ReadLine();
string[] bookParts = bookInput.Split('|');
string bookId = bookParts[0];
string bookTitle = bookParts[1];
string bookAuthor = bookParts[2];
Book book = new Book(bookId, bookTitle, bookAuthor);
library.AddBook(book);
}
// 초기 상태 설정을 위한 대출 작업 횟수 읽기
int numBorrows = Convert.ToInt32(Console.ReadLine());
// 대출 작업 처리 (도서 ID만 사용)
for (int i = 0; i < numBorrows; i++)
{
string bookId = Console.ReadLine();
Book book = library.GetBookById(bookId);
if (book != null)
{
book.IsAvailable = false;
}
}
// 검색 명령 읽기
string searchCommand = Console.ReadLine();
// 검색 명령 처리
List<Book> results = new List<Book>();
if (searchCommand == "available")
{
results = library.GetAvailableBooks();
}
else if (searchCommand == "borrowed")
{
results = library.GetBorrowedBooks();
}
else if (searchCommand.Contains("|"))
{
string[] parts = searchCommand.Split('|');
string searchType = parts[0];
string searchValue = parts[1];
if (searchType == "title")
{
results = library.SearchByTitle(searchValue);
}
else if (searchType == "author")
{
results = library.GetBooksByAuthor(searchValue);
}
}
// 결과 출력
if (results.Count == 0)
{
Console.WriteLine("No books found");
}
else
{
foreach (Book book in results)
{
Console.WriteLine($"{book.Title} by {book.Author}");
}
}
}
}
}