Menu
Coddy logo textTech

검색을 위한 LINQ

Coddy C# 여정의 객체 지향 프로그래밍 섹션에 포함된 레슨 — 70개 중 65번째.

challenge icon

챌린지

쉬움

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 Tolkien

LINQ는 복잡한 루프가 될 수 있는 코드를 표현력 있고 읽기 쉬운 쿼리로 변환합니다. 필터링을 위한 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}");
                }
            }
        }
    }
}

객체 지향 프로그래밍의 모든 레슨