C#/배열

[C#]배열에서 조건에 맞는 값 검색(Find, FindAll, FindLast)

DevStory 2021. 10. 2.

C#에서 종종 로직에 일치하는 배열의 값을 검색해야 하는 경우가 존재합니다. 

 

이번 포스팅에서는 배열에서 특정 조건에 일치하는 값을 검색하는 메서드를 소개합니다.

 

참고로 람다식과 제네릭 컬렉션인 List에 대한 사전 지식이 없다면, 내용이 어려울 수 있습니다.

 


첫 번째 요소를 반환하는 Array.Find() 메서드

Find() 메서드는 특정 조건에 일치하는 첫 번째 요소(값)를 반환합니다.

 

첫 번째 요소는 시작 위치(0번째 Index)와 가장 가까운 배열의 요소입니다.

 

특정 조건에 일치하는 값이 없으면 타입(T)의 기본값을 반환합니다.

 

특정 조건에 일치하는 값을 찾으면 검색을 중단합니다.

 

다음은 Find() 메서드의 구문입니다.

public static T Find<T> (T[] array, Predicate<T> match);

매개변수

T[] array

검색할 1차원 배열입니다.

 

Predicate<T> match

Predicate 델리게이트로 람다 표현식이 될 수 있습니다.

 

다음 코드는 string 배열에서 문자열 "AB", "ABCC"와 일치하는 첫 번째 요소를 찾는 코드입니다.

string[] strArr = {"A", "B", "C", "AB", "AB", "ABC" };

string strFindValue1 = Array.Find(strArr, element => element == "AB" );
string strFindValue2 = Array.Find(strArr, element => element == "ABCC");

Console.WriteLine($"Array.Find(strArr, element =>  element == \"AB\" )의 결과: {strFindValue1} ");
Console.WriteLine($"Array.Find(strArr, element =>  element == \"ABCC\" )의 결과: {strFindValue2} ");

실행 결과

strArr에는 "ABCC"가 없으므로 strFindValue2의 값은 null입니다.

 

다음 코드는 string 배열에서 문자열의 길이가 1인 첫 번째 요소를 찾는 코드입니다.

string[] strArr = {"A", "B", "C", "AB", "AB", "ABC" };

string strFindValue = Array.Find(strArr, element => element.Length == 1 );

Console.WriteLine($"Array.Find(strArr, element =>  elementLength == 1 )의 결과: {strFindValue} ");

실행 결과

strArr에는 문자열의 길이가 1인 요소는 "A", "B", "C"가 존재하지만, Find() 메서드는 첫 번째 메서드를 반환하므로 "A"가 반환되었습니다.

 

다음 코드는 객체 배열에서 Name의 속성이 "Steve"인 요소를 찾는 코드입니다.

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

class Program
{
    static void Main(string[] args)
    { 
        Person[] personArr =
        {
            new Person() { Name = "Steve", Age = 20 },
            new Person() { Name = "Bill", Age = 20 },
            new Person() { Name = "Steve", Age = 25 }
        };

        Person findPersonObj = Array.Find(personArr, element => element.Name == "Steve");

        Console.WriteLine($"findPersonObj.Name : {findPersonObj.Name} / findPersonObj.Age : {findPersonObj.Age}");
    }
}

실행 결과

Name이 "Steve"인 인스턴스가 2개이지만, 첫 번째 인스턴스가 반환되었습니다.

 

다음 코드는 List 형식에서 Find() 메서드를 사용하는 코드입니다.

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

class Program
{
    static void Main(string[] args)
    { 
        List<Person> personList = new List<Person>() {
            new Person() { Name = "Steve", Age = 20 },
            new Person() { Name = "Bill", Age = 20 },
            new Person() { Name = "Steve", Age = 25 }
        };

        Person findPersonObj = personList.Find(element => element.Name == "Steve");

        Console.WriteLine($"findPersonObj.Name : {findPersonObj.Name} / findPersonObj.Age : {findPersonObj.Age}");
    }
}

실행 결과

Collections.Generic.List<T>에는 Find() 메서드가 내장되어 있으므로 List에서 Find() 메서드를 호출할 수 있습니다.

 

Array.Find() 메서드와 마찬가지로 한 개의 요소만 반환하므로 단일 객체를 반환합니다.

 

List에서 Find() 메서드의 구문은 다음과 같습니다.

public T Find(Predicate<T> match);

첫 번째 매개변수에 Predicate 델리게이트로 람다 표현식을 전달합니다.


모든 요소를 반환하는 Array.FindAll() 메서드

FindAll() 메서드는 특정 조건에 일치하는 모든 요소를 반환합니다.

 

다음은 FindAll() 메서드 구문입니다.

public static T[] FindAll<T> (T[] array, Predicate<T> match);

반환 값이 배열이라는 점을 제외하고는 Find() 메서드와 동일합니다.

 

다음 코드는 string 배열에서 문자열의 길이가 1인 요소들을 찾는 코드입니다.

string[] strArr = { "A", "B", "C", "AB", "AB", "ABC" };

string[] strFindValueArr = Array.FindAll(strArr, element => element.Length == 1);

foreach (string str in strFindValueArr)
{
    Console.WriteLine($"Array.FindAll(strArr, element =>  elementLength == 1 )의 결과: {str} ");
}

실행 결과

배열 strArr의 문자열의 길이가 1인 요소 "A", "B", "C"가 반환되었습니다.

 

다음 코드는 List 형식에서 FindAll() 메서드를 사용하는 코드입니다.

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

class Program
{
    static void Main(string[] args)
    { 
        List<Person> personList = new List<Person>() {
            new Person() { Name = "Steve", Age = 20 },
            new Person() { Name = "Bill", Age = 20 },
            new Person() { Name = "Steve", Age = 25 }
        };

        List<Person> findPersonObj = personList.FindAll(element => element.Name == "Steve");

        foreach(Person personObj in findPersonObj) { 
            Console.WriteLine($"findPersonObj.Name : {personObj.Name} / findPersonObj.Age : {personObj.Age}");
        }
    }
}

실행 결과

Collections.Generic.List에는 FindAll() 메서드가 내장되어 있으며, List 형식으로 값을 반환합니다.

 

List에서 FindAll() 메서드의 구문은 다음과 같습니다.

public List<T> FindAll(Predicate<T> match);

마지막 요소를 반환하는 Array.FindLast() 메서드

FindLast() 메서드는 특정 조건을 만족하는 마지막 요소를 반환합니다.

 

Find() 메서드와 유사하며, 배열의 마지막 요소부터 조건에 맞는 값을 검색합니다.

 

조건에 맞는 값을 찾으면 검색이 중단됩니다.

 

다음은 FindLast() 메서드의 구문입니다.

public static T FindLast<T> (T[] array, Predicate<T> match);

 

다음 코드는 string 배열에서 문자열의 길이가 1인 마지막 요소를 찾는 코드입니다.

string[] strArr = { "A", "B", "C", "AB", "AB", "ABC" };

string strFindValue = Array.FindLast(strArr, element => element.Length == 1);

Console.WriteLine($"Array.FindLast(strArr, element =>  elementLength == 1 )의 결과: {strFindValue} ");

실행 결과

 

다음 코드는 List 형식에서 Find() 메서드를 사용하는 코드입니다.

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

class Program
{
    static void Main(string[] args)
    { 
        List<Person> personList = new List<Person>() {
            new Person() { Name = "Steve", Age = 20 },
            new Person() { Name = "Bill", Age = 20 },
            new Person() { Name = "Steve", Age = 25 }
        };

        Person lastPersonObj = personList.FindLast(element => element.Name == "Steve");

        Console.WriteLine($"lastPersonObj.Name : {lastPersonObj.Name} / lastPersonObj.Age : {lastPersonObj.Age}");
    }
}

실행 결과

Collections.Generic.List<T>에는 FindLast() 메서드가 내장되어 있으므로 List에서 FindLast() 메서드를 호출할 수 있습니다.

 

Array.FindLast() 메서드와 마찬가지로 한 개의 요소만 반환하므로 단일 객체를 반환합니다.

 

List에서 FindLast() 메서드의 구문은 다음과 같습니다.

public T FindLast(Predicate<T> match);

첫 번째 매개변수에 Predicate 델리게이트로 람다 표현식을 전달합니다.

반응형

댓글