C#/C# 강좌

C# List<T> Find , FindIndex , FindAll , FindLast | C# 강좌

DragonTory 2023. 2. 22. 22:44
반응형

C# List<T> Find , FindIndex , FindAll , FindLast | C# 강좌

 

C#에서 List<T> 클래스는 목록에서 지정된 조건과 일치하는 요소를 검색하는 데 사용할 수 있는 Find 메서드를 제공합니다.

List<T>.Find :
Find 메서드의 형식은 다음과 같습니다.

public T Find(Predicate<T> match)

여기서 match 매개 변수는 검색할 조건을 나타내는 Predicate<T> 대리자입니다.

Predicate<T> : 

public delegate bool Predicate<in T>(T obj);

Predicate<T>는 위의 형식에서 볼 수 있듯이 대리자(delegate, 메서드 내부에서 뭘 할지는 모르지만 위와 같은 형태를 가지고 있는 메서드를 대신 한다고 해서 대리자 )인데, 대리자 중에서도 T의 형식으로 지정된 타입을 인자로 받아서 결국 bool 값을 리턴 하는 메서드를 나타냅니다.

보통 람다식으로 이용해서 사용 하게 됩니다. ( n => n == 3 )

 

Example 1:

다음은 Find 메서드를 사용하는 방법을 보여 주는 예입니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

        int foundNumber = numbers.Find(n => n == 3);

        Console.WriteLine(foundNumber); // Output: 3
    }
}

이 예제에서는 5개의 요소가 있는 numbers라는 List<int>를 만듭니다.

그런 다음 이 목록에서 Find 메서드를 호출하고 람다 식을 인수로 전달합니다.

이 람다 식(n => n == 3)은 요소가 3인 경우를 검색 하라는 것을 나타냅니다.

Find 메서드는 목록에서 이 조건을 충족하는 첫 번째 요소(이 경우 3)를 반환합니다. 

그런 다음 이 값을 foundNumber 변수에 저장하고 콘솔에 출력합니다.

만약, 검색 결과 일치 하는 요소가 없다면 Find 메서드는 0의 값을 리턴 합니다.

 

Example 2:

다음은 사용자 지정 조건자 메서드와 함께 Find 메서드를 사용하는 또 다른 예입니다.

using System;
using System.Collections.Generic;

class Program
{
    static bool IsEven(int n)
    {
        return n % 2 == 0;
    }

    static void Main()
    {
        List<int> numbers = new List<int> { 1, 2, 3, 4, 5 };

        int evenNumber = numbers.Find(IsEven);

        Console.WriteLine(evenNumber); // Output: 2
    }
}

이 예제에서는 int 매개 변수를 사용하고 숫자가 짝수인지 여부를 나타내는 bool을 반환하는 IsEven이라는 사용자 지정 메서드를 정의합니다. 

그런 다음 5개의 요소가 있는 numbers라는 List<int>를 만듭니다. 

이 목록에서 Find 메서드를 호출하고 IsEven 메서드를 match 매개 변수로 전달합니다.

Find 메서드는 true를 반환하는 첫 번째 요소를 찾을 때까지 목록의 각 요소에 IsEven 메서드를 적용합니다.

이 경우 해당 요소는 목록의 첫 번째 짝수인 2입니다. 이 값을 evenNumber 변수에 저장하고 콘솔에 출력합니다.

 

두개의 인자를 가지는 Predicate<T>  메서드 사용 방법:

 

Match 매개변수는 두 개의 매개변수를 사용하는 메서드일 수도 있습니다.

여기서 첫 번째 매개변수는 목록의 요소이고 두 번째 매개변수는 사용자 정의 개체입니다.

이렇게 하면 필요한 경우 일치 메서드에 추가 데이터를 전달할 수 있습니다.

using System;
using System.Collections.Generic;

class Product
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

class Program
{
    static void Main()
    {
        List<Product> products = new List<Product>
        {
            new Product { Name = "apple", Price = 0.50m },
            new Product { Name = "banana", Price = 0.25m },
            new Product { Name = "cherry", Price = 0.75m },
            new Product { Name = "date", Price = 1.00m },
            new Product { Name = "elderberry", Price = 0.90m },
        };

        Product product = products.Find(p => IsCheaperThan(p, 0.80m));

        if (product == null)
        {
            Console.WriteLine("No product found with a price lower than 0.80");
        }
        else
        {
            Console.WriteLine(product.Name); // Output: apple
        }
    }

    static bool IsCheaperThan(Product p, decimal price)
    {
        return p.Price < price;
    }
}

이와 같이

products.Find(p => IsCheaperThan(p, 0.80m));

사용 할 수 있습니다.

 

Class를 요소 항목으로 가지는 List<T>.Find :

다음은 Find 메서드를 사용하여 사용자 지정 개체 목록에서 특정 요소를 검색하는 또 다른 예입니다.

using System;
using System.Collections.Generic;

class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

class Program
{
    static void Main()
    {
        List<Person> people = new List<Person>
        {
            new Person { Name = "Alice", Age = 25 },
            new Person { Name = "Bob", Age = 30 },
            new Person { Name = "Charlie", Age = 35 }
        };

        Person person = people.Find(p => p.Name == "Bob");

        Console.WriteLine(person.Age); // Output: 30
    }
}

이 예에서는 Name과 Age라는 두 가지 속성을 사용하여 Person 클래스를 정의합니다.

그런 다음 3개의 Person 개체가 있는 people이라는 List<Person>을 만듭니다.

이 목록에서 Find 메서드를 호출하고 person 개체의 Name 속성이 "Bob"과 같은지 확인하는 람다 식을 전달합니다.

Find 메서드는 이 조건을 충족하는 Name 속성이 "Bob"으로 설정된 첫 번째 Person 개체를 반환합니다.

이 객체를 person 변수에 저장하고 Age 속성을 콘솔에 출력( 30)합니다.

목록의 요소가 일치 매개 변수로 지정된 조건을 충족하지 않으면 Find 메서드는 목록의 요소 형식에 대한 기본값을 반환합니다. 

일치 조건이 없을 경우 참조 형식의 경우는 리턴값이 null입니다.

 

List<T>.FindIndex :

 

FindIndex 메서드는 List 요소 중에 조건에 일치 하는 요소가 있을 경우 해당 인덱스(몇번째 요소인지 번호, 0부터 시작)를 리턴 하는 메서드 입니다.

일치 하는 요소가 없을 경우에는 -1을 반환 합니다.

다음은 특정 문자로 시작하는 문자열 목록에서 첫 번째 요소의 인덱스를 검색하기 위해 FindIndex 메서드를 사용하는 예입니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<string> fruits = new List<string> { "apple", "banana", "cherry", "date", "elderberry" };

        int index = fruits.FindIndex(f => f.StartsWith("c"));

        if (index == -1)
        {
            Console.WriteLine("No fruit starting with 'c' found");
        }
        else
        {
            Console.WriteLine(fruits[index]); // Output: cherry
        }
    }
}

이 예제에서는 5개의 요소가 있는 fruits라는 List을 만듭니다.

 이 목록에서 FindIndex 메서드를 호출하고 과일이 문자 "c"로 시작하는지 확인하는 람다 식을 전달합니다. 

FindIndex 메서드는 람다 식에 지정된 조건을 충족하는 목록의 첫 번째 요소인 "cherry" 요소의 인덱스인 2를 반환합니다.

index 변수에 이 인덱스를 저장하고 인덱스가 -1인지 여부에 따라 "체리" 요소 또는 "c"로 시작하는 과일이 발견되지 않았음을 나타내는 메시지를 인쇄합니다.

FindIndex 메서드는 일치 매개 변수에 지정된 조건을 충족하는 요소를 목록에서 찾지 못한 경우 -1을 반환합니다.

 

List<T>.FindAll :

FindAll 메서드는 match에 지정된 조건과 일치하는 모든 요소를 반환 하는 메서드 입니다.

다음 예를 살펴 보면,

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 3, 5, 7, 9 };

        List<int> greaterThan5 = numbers.FindAll(n => n > 5);

        foreach (int number in greaterThan5)
        {
            Console.WriteLine(number); // Output: 7 9
        }
    }
}

이 예제에서는 5개의 정수가 포함된 numbers라는 List<int>를 만듭니다.

이 목록에서 FindAll 메서드를 호출하고 숫자가 5보다 큰지 확인하는 람다 식을 전달합니다.

FindAll 메서드는 원래 목록에서 지정된 조건을 충족하는 모든 요소를 포함하는 새 List<int>를 반환합니다. (이 경우 숫자 7과 9를 요소로 가지는 List)

이 새 List를 greaterThan5 변수에 저장하고 이 목록의 각 요소를 foreach 루프를 사용하여 콘솔에 출력합니다.

FindAll 메서드는 원본 목록에서 일치 매개 변수에 지정된 조건을 충족하는 모든 요소가 포함된 새 목록을 반환합니다. 

목록의 요소가 조건을 충족하지 않으면 FindAll 메서드는 빈 List을 반환합니다.( List.Count == 0 )

 

List<T>.FindLast :

목록을 검색하는 또 다른 유용한 방법은 지정된 조건을 만족하는 목록의 마지막 요소를 반환하는 FindLast 메서드입니다. 

다음은 FindLast 메서드를 사용하여 정수 목록에서 마지막 짝수를 검색하는 예입니다.

using System;
using System.Collections.Generic;

class Program
{
    static void Main()
    {
        List<int> numbers = new List<int> { 1, 3, 5, 7, 8, 9, 10 };

        int lastEvenNumber = numbers.FindLast(n => n % 2 == 0);

        if (lastEvenNumber == 0)
        {
            Console.WriteLine("No even number found");
        }
        else
        {
            Console.WriteLine(lastEvenNumber); // Output: 10
        }
    }
}

이 예제에서는 7개의 정수가 포함된 numbers라는 List<int>를 만듭니다. 이

목록에서 FindLast 메서드를 호출하고 숫자가 짝수인지 여부를 확인하는 람다 식을 전달합니다.

FindLast 메서드는 람다 식에 지정된 조건을 충족하는 목록의 마지막 요소(이 경우 숫자 10)를 반환합니다.

이 숫자를 lastEvenNumber 변수에 저장하고 lastEvenNumber가 0인지 여부에 따라 숫자 또는 짝수가 발견되지 않았음을 나타내는 메시지를 인쇄합니다.

FindLast 메서드가 일치 매개 변수에 지정된 조건을 충족하는 요소를 목록에서 찾지 못한 경우 목록의 요소 유형에 대한 기본값을 반환합니다. 

int와 같은 값 유형의 경우 기본값은 0입니다. 참조의 경우는 null 값입니다.

 

 

tag:

c#, c# List Find, C# Find, c# list FindAll, c# list findindex, c# findlast, c# list FindLast, c# List

반응형