Computer >> 컴퓨터 >  >> 프로그래밍 >> C#

C#에서 배열에 중복 숫자가 있는지 확인하는 방법

C# 프로그래밍에서 배열 안에 같은 숫자가 두 번 이상 등장하는지, 즉 중복 값이 존재하는지 확인해야 하는 경우가 자주 있습니다. 가장 대표적인 방법은 Dictionary(딕셔너리)를 사용해 각 요소의 등장 횟수를 세는 것입니다.

1단계: 배열 선언하기

먼저 검사할 정수형 배열을 준비합니다.

int[] arr = {
   87,
   55,
   23,
   87,
   45,
   23,
   98
};

2단계: 딕셔너리로 등장 횟수 세기

딕셔너리를 하나 선언한 뒤, foreach 루프로 배열을 순회하면서 각 숫자가 몇 번 나왔는지 기록합니다. 키가 이미 존재하면 카운트를 1 증가시키고, 그렇지 않으면 1로 초기화합니다.

var dict = new Dictionary<int, int>();

foreach(var count in arr) {
   if (dict.ContainsKey(count))
      dict[count]++;
   else
      dict[count] = 1;
}

딕셔너리의 Value 값이 곧 해당 숫자의 등장 횟수를 의미하므로, 이 값이 2 이상이라면 중복이 존재한다고 판단할 수 있습니다.

전체 예제 코드

using System;
using System.Collections.Generic;

namespace Demo {
   public class Program {
      public static void Main(string[] args) {

         int[] arr = {
            87,
            55,
            23,
            87,
            45,
            23,
            98
         };

         var dict = new Dictionary<int, int>();

         foreach(var count in arr) {
            if (dict.ContainsKey(count))
               dict[count]++;
            else
               dict[count] = 1;
         }

         foreach(var val in dict)
            Console.WriteLine("{0} occurred {1} times", val.Key, val.Value);
      }
   }
}

출력 결과

87 occurred 2 times
55 occurred 1 times
23 occurred 2 times
45 occurred 1 times
98 occurred 1 times

결과에서 볼 수 있듯이 87과 23이 각각 2번씩 나타났으므로, 이 배열에는 중복된 숫자가 존재합니다.

참고: LINQ로 더 간단하게 확인하기

중복 여부만 true/false 형태로 빠르게 알고 싶다면 LINQ의 GroupBy를 활용해 한 줄로 처리할 수도 있습니다.

using System.Linq;

bool hasDuplicate = arr.GroupBy(x => x).Any(g => g.Count() > 1);
Console.WriteLine(hasDuplicate); // True 출력

또는 HashSet을 이용하는 방법도 성능 면에서 매우 효율적입니다.

var seen = new HashSet<int>();
bool hasDuplicate = arr.Any(x => !seen.Add(x));

HashSet의 Add 메서드는 이미 존재하는 요소를 추가하려 할 때 false를 반환하므로, 이 특성을 이용하면 중복을 즉시 판별할 수 있습니다.