C#/배열

[C#]배열 값 위치(index) 찾기(IndexOf, FindIndex)

DevStory 2021. 10. 3.

이번 포스팅에서는 C#에서 배열의 특정 값 또는 특정 조건을 만족하는 값의 위치(index)를 찾는 방법에 대해 설명합니다.

 

배열의 특정 값을 만족하는 요소의 위치를 찾는 메서드는 Array.Index() 및 Array.LastIndexOf() 메서드가 있으며, 특정 조건을 만족하는 값의 위치를 찾는 메서드는 Array.FindIndex() 및 Array.FindLastIndex() 메서드가 존재합니다.

 

Array.FindIndex() 및 Array.FindLastIndex() 메서드를 사용하면, 클래스 배열에서 특정 조건을 만족하는 값의 위치도 구할 수 있습니다.

 

참고로 람다식에 대한 사전 지식이 없다면, Array.FindIndex(), Array.FindLastIndex() 메서드 사용 방법은 내용이 어려울 수 있습니다.

 


Array.IndexOf() 메서드

Array.IndexOf() 메서드는 배열에서 특정 값을 만족하는 첫 번째 위치를 반환합니다.

 

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

 

배열에서 특정 값을 찾으면 검색을 중단하며, 특정 값이 존재하지 않는 경우 -1을 반환합니다. 

 

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

public static int IndexOf (Array array, object? value);

매개변수

Array array

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

 

object? value

array에서 찾을 값입니다.

 

다음 코드는 string 배열에서 문자열 "A", "C"의 위치를 찾는 코드입니다.

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

int indexA = Array.IndexOf(strArr, "A");
int indexC = Array.IndexOf(strArr, "C");

Console.WriteLine($"Array.IndexOf(strArr, \"A\") : {indexA}");
Console.WriteLine($"Array.IndexOf(strArr, \"C\") : {indexC}");

 

실행 결과

문자열 "A"의 위치는 0, 1번째 위치에 존재하는데, 시작 위치(0번째 Index)와 가까운 0이 반환되었습니다.

 

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

List<string> strList = new List<string>{ "A", "B", "C", "A" };

int indexA = strList.IndexOf("A");
int indexE = strList.IndexOf("E");

Console.WriteLine($"strList.IndexOf(\"A\") : {indexA}");
Console.WriteLine($"strList.IndexOf(\"E\") : {indexE}");

실행 결과

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

 

반환 값은 Array.IndexOf() 메서드와 동일합니다.

 

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

public int IndexOf (T item);

Array.LastIndexOf() 메서드

Array.LastIndexOf() 메서드는 배열에서 특정 값을 만족하는 마지막 위치를 반환합니다.

 

Index() 메서드와 유사하며, 배열의 마지막 위치부터 특정 값을 검색합니다.

 

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

public static int LastIndexOf (Array array, object? value);

 

다음 코드는 string 배열에서 문자열 "A", "C"의 위치를 찾는 코드입니다.

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

int indexA = Array.LastIndexOf(strArr, "A");
int indexC = Array.LastIndexOf(strArr, "C");

Console.WriteLine($"Array.LastIndexOf(strArr, \"A\") : {indexA}");
Console.WriteLine($"Array.LastIndexOf(strArr, \"C\") : {indexC}");

실행 결과

문자열 "A"는 0, 3 번째 위치에 존재하는데, 마지막 위치와 가까운 3이 반환되었습니다.

 

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

List<string> strList = new List<string>{ "A", "B", "C", "A" };

int indexA = strList.LastIndexOf("A");
int indexC = strList.LastIndexOf("C");

Console.WriteLine($"strList.LastIndexOf(\"A\") : {indexA}");
Console.WriteLine($"strList.LastIndexOf(\"C\") : {indexC}");

실행 결과

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

 

반환 값은 Array.LastIndexOf() 메서드와 동일합니다.

 

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

public int LastIndexOf (T item);

Array.FindIndex() 메서드

FindIndex() 메서드는 특정 값 또는 특정 조건을 만족하는 첫 번째 위치를 반환합니다.

 

배열에서 특정 값을 찾으면 검색을 중단하며, 특정 값이 존재하지 않는 경우 -1을 반환합니다.

 

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

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

매개변수

T[] array

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

 

Predicate<T> match

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

 

다음 코드는 string 배열에서 문자열 "A", "E"의 위치를 찾는 코드입니다.

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

int indexA = Array.FindIndex(strArr, element => element == "A");
int indexE = Array.FindIndex(strArr, element => element == "E");

Console.WriteLine($"Array.FindIndex(strArr, element => element == \"A\") : {indexA}");
Console.WriteLine($"Array.FindIndex(strArr, element => element == \"E\") : {indexE}");

실행 결과

 

다음 코드는 string 배열에서 문자열의 길이가 2인 위치를 찾는 코드입니다.

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

int findIndex = Array.FindIndex(strArr, element => element.Length == 2);

Console.WriteLine($"Array.FindIndex(strArr, element => element.Length == 2) : {findIndex}");

실행 결과

 

FindexIndex() 메서드의 장점은 클래스 배열에서 사용할 수 있다는 점입니다.

 

다음 코드는 클래스 배열에서 Age 속성이 20보다 큰 값의 위치를 찾는 코드입니다.

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 }
        };

        int findPersonIdx = Array.FindIndex(personArr, element => element.Age > 20);

        Console.WriteLine($"Array.FindIndex(personArr, element => element.Age > 20) : {findPersonIdx}");
    }
}

실행 결과

 

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

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 }
        };

        int findPersonIdx = personList.FindIndex(element => element.Age > 20);

        Console.WriteLine($"personList.FindIndex(element => element.Age > 20) : {findPersonIdx}");
    }
}

실행 결과

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

 

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

public int FindIndex (Predicate<T> match);

Array.FindLastIndex() 메서드

FindLastIndex() 메서드는 특정 값 또는 특정 조건을 만족하는 마지막 위치를 반환합니다.

 

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

 

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

 

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

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

 

다음 코드는 string 배열에서 문자열 "A", "E"의 위치를 찾는 코드입니다.

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

int indexA = Array.FindLastIndex(strArr, element => element == "A");
int indexE = Array.FindLastIndex(strArr, element => element == "E");

Console.WriteLine($"Array.FindLastIndex(strArr, element => element == \"A\") : {indexA}");
Console.WriteLine($"Array.FindLastIndex(strArr, element => element == \"E\") : {indexE}");

실행 결과

 

다음 코드는 클래스 배열에서 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 }
        };

        int findPersonIdx = Array.FindLastIndex(personArr, element => element.Name == "Steve");

        Console.WriteLine($"Array.FindLastIndex(personArr, element => element.Age > 20) : {findPersonIdx}");
    }
}

실행 결과

 

FindIndex() 메서드와 마찬가지로 Collections.Generic.List<T>에 내장되어 있습니다.

 

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

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 }
        };

        int findPersonIdx = personList.FindLastIndex(element => element.Age < 30);

        Console.WriteLine($"personList.FindLastIndex(element => element.Age < 30) : {findPersonIdx}");
    }
}

실행 결과

 

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

public int FindLastIndex (Predicate<T> match);
반응형

댓글