C#/배열

[C#]배열에서 특정 값 삭제하는 방법

DevStory 2022. 8. 16.

배열에서 특정 값 삭제하는 방법

C#에서 배열의 특정 값을 삭제하는 메서드는 존재하지 않습니다.

 

하지만, Array 클래스가 아닌 다른 클래스에서 제공하는 메서드를 응용한다면, 특정 값이 제거된 새로운 배열을 만들 수 있습니다.

 

이번 포스팅은 배열에서 특정 값이 제거된 새로운 배열을 생성하는 몇 가지 방법을 소개합니다.

- LINQ의 Where 메서드

- LINQ의 Except 메서드

- Array 클래스의 FindAll 메서드

 

참고로 LINQ의 Where() 메서드와 Except() 메서드를 사용하기 위해서는 .Net Framework 3.5 버전 이상이어야 합니다.


LINQ의 Where 메서드

LINQ에서 제공하는 Where() 메서드는 배열 또는 List와 같은 데이터 집합에서 특정 데이터를 필터링하는 목적으로 사용됩니다.

 

다음 예제는 int 타입의 배열에서 3이 제거된 새로운 배열을 반환합니다.

class Program
{
  static void Main(string[] args)
  {
    int[] intArray = { 1, 2, 3, 1, 2, 3 };
    int[] newArray = intArray.Where(num => num != 3).ToArray();

    Console.WriteLine("[기존 배열: intArray]");
    foreach(int num in intArray)
    {
      Console.Write(num + " ");
    }
    Console.WriteLine("\n");

    Console.WriteLine("[새로운 배열: newArray]");
    foreach (int num in newArray)
    {
      Console.Write(num + " ");
    }
  }
}

[실행 결과]

[기존 배열: intArray]
1 2 3 1 2 3

[새로운 배열: newArray]
1 2 1 2

LINQ에서 제공하는 Where() 메서드는 배열이 아닌 IEnumerable<TSource>를 반환합니다.

 

따라서, Where() 메서드 뒤에 ToArray() 메서드를 호출하여 IEnumerable<TSource>를 배열로 변환합니다.


LINQ의 Where 메서드 - 여러 값 제거

Where() 메서드 사용 방법이 익숙하다면, 배열에서 제거하고 싶은 값을 여러 개 설정할 수 있습니다.

 

다음 예제는 int 타입의 배열에서 2와 3이 제거된 새로운 배열을 반환합니다.

class Program
{
  static void Main(string[] args)
  {
    int[] intArray = { 1, 2, 3, 1, 2, 3 };
    int[] newArray = intArray.Where(num => num != 2 && num != 3).ToArray();

    Console.WriteLine("[기존 배열: intArray]");
    foreach(int num in intArray)
    {
      Console.Write(num + " ");
    }
    Console.WriteLine("\n");

    Console.WriteLine("[새로운 배열: newArray]");
    foreach (int num in newArray)
    {
      Console.Write(num + " ");
    }
  }
}

[실행 결과]

[기존 배열: intArray]
1 2 3 1 2 3

[새로운 배열: newArray]
1 1

LINQ에서 Where() 메서드 사용 방법은 아래 포스팅에서 확인할 수 있습니다.

 

[C#]LINQ 데이터 필터링 방법 - Where절

Where절 LINQ의 Where문은 원본 데이터에서 일부 조건을 만족하는 데이터를 추출해야하는 경우 사용됩니다. 예를 들자면, 아래 조건을 만족하는 데이터를 추출하기 위해 Where문을 사용할 수 있습니

developer-talk.tistory.com


LINQ의 Except 메서드

두 번째 방법으로 LINQ에서 제공하는 Except() 메서드를 사용합니다.

 

Except() 메서드는 차집합 메서드로 알려져 있으며, 배열 또는 List와 같은 데이터 집합에서 특정 데이터가 제거된 데이터를 반환합니다.

 

다음 예제는 int 타입의 배열에서 3이 제거된 새로운 배열을 반환합니다.

class Program
{
  static void Main(string[] args)
  {
    int[] intArray = { 1, 2, 3, 4, 5 };
    int[] newArray = intArray.Except(new int[] { 3 }).ToArray();

    Console.WriteLine("[기존 배열: intArray]");
    foreach(int num in intArray)
    {
      Console.Write(num + " ");
    }
    Console.WriteLine("\n");

    Console.WriteLine("[새로운 배열: newArray]");
    foreach (int num in newArray)
    {
      Console.Write(num + " ");
    }
  }
}

[실행 결과]

[기존 배열: intArray]
1 2 3 4 5

[새로운 배열: newArray]
1 2 4 5

Where() 메서드와 마찬가지로 Except() 메서드는 IEnumerable<TSource>를 반환합니다.

 

따라서, ToArray() 메서드를 호출하여 IEnumerable<TSource>를 배열로 변환합니다.


Except 메서드의 문제점

Except() 메서드의 문제점은 중복 값이 제거된 배열을 반환한다는 것입니다.

 

따라서, 배열에 중복 값이 존재하는 경우 Except() 메서드를 사용하면 안 됩니다.

 

다음 예제는 int 타입의 배열에 중복 값인 1, 2가 존재합니다.

 

Except() 메서드를 사용하여 3이 제거된 새로운 배열을 확인하면 중복 값이 제거된 것을 확인할 수 있습니다.

class Program
{
  static void Main(string[] args)
  {
    int[] intArray = { 1, 2, 3, 1, 2, 4 };
    int[] newArray = intArray.Except(new int[] { 3 }).ToArray();

    Console.WriteLine("[기존 배열: intArray]");
    foreach(int num in intArray)
    {
      Console.Write(num + " ");
    }
    Console.WriteLine("\n");

    Console.WriteLine("[새로운 배열: newArray]");
    foreach (int num in newArray)
    {
      Console.Write(num + " ");
    }
  }
}

[실행 결과]

[기존 배열: intArray]
1 2 3 1 2 4

[새로운 배열: newArray]
1 2 4

LINQ에서 Except() 메서드 사용 방법은 아래 포스팅에서 확인할 수 있습니다.

 

[C#]LINQ 차집합 구하는 방법 - Except 메서드

Except 메서드 LINQ의 Except() 메서드는 첫 번째 데이터에는 존재하지만 두 번째 데이터에는 없는 요소를 반환합니다. 예를 들어 다음 소스 코드를 봅시다. int[] intArrayA = { 0, 2, 4, 5 }; int[] intArrayB..

developer-talk.tistory.com


Array의 FindAll 메서드

마지막 방법으로 Array 클래스에서 제공하는 FindAll() 메서드를 사용합니다.

 

FindAll() 메서드의 첫 번째 매개변수로 배열을 전달하고 두 번째 매개변수로 조건문을 전달합니다.

 

FindAll() 메서드는 LINQ의 Where() 메서드와 비슷하며, 조건을 만족하는 모든 요소를 반환합니다.

 

다음 예제는 int 타입의 배열에서 3이 제거된 새로운 배열을 반환합니다.

class Program
{
  static void Main(string[] args)
  {
    int[] intArray = { 1, 2, 3, 1, 2, 4 };
    int[] newArray = Array.FindAll(intArray, num => num != 3).ToArray();

    Console.WriteLine("[기존 배열: intArray]");
    foreach(int num in intArray)
    {
      Console.Write(num + " ");
    }
    Console.WriteLine("\n");

    Console.WriteLine("[새로운 배열: newArray]");
    foreach (int num in newArray)
    {
      Console.Write(num + " ");
    }
  }
}

[실행 결과]

[기존 배열: intArray]
1 2 3 1 2 4

[새로운 배열: newArray]
1 2 1 2 4

Array의 FindAll 메서드 - 여러 값 제거

Array 클래스의 FindAll() 메서드는 Where() 메서드처럼 조건문을 통해 여러 값을 제거할 수 있습니다.

 

다음 예제는 int 타입의 배열에서 2와 3이 제거된 새로운 배열을 반환합니다.

class Program
{
  static void Main(string[] args)
  {
    int[] intArray = { 1, 2, 3, 1, 2, 4 };
    int[] newArray = Array.FindAll(intArray, num => num != 2 && num != 3).ToArray();

    Console.WriteLine("[기존 배열: intArray]");
    foreach(int num in intArray)
    {
      Console.Write(num + " ");
    }
    Console.WriteLine("\n");

    Console.WriteLine("[새로운 배열: newArray]");
    foreach (int num in newArray)
    {
      Console.Write(num + " ");
    }
  }
}

[실행 결과]

[기존 배열: intArray]
1 2 3 1 2 4

[새로운 배열: newArray]
1 1 4
반응형

댓글