study/코딩

[c# 개념] Dictionary<> 중복 안되게 값 추가

lucykorea414 2023. 5. 30. 21:41
728x90

[폼 구성 계획]

  • datagridview로 dictionary<>에 값이 저장/변경될때마다 바로 보이게 함.
  • datagridview에 중복이 일어나면 표시되게(log형식) 함.
  • 버튼을 누르면 난수값을 생성하여 dictionary<>의 key값으로 저장하고 value는 "new"를 가짐.

 


[코드]

  • 폼이 로드 될때 기본적으로 몇개의 값은 dictionary<>에 저장
public Form1()
        {
            InitializeComponent();

            key.Add(0, "zero");
            key.Add(1, "one");
            key.Add(2, "two");
            key.Add(3, "three");

            foreach (var item in key)
            {
                dataGridView1.Rows.Add(item.Key, item.Value);
            }
        }
  • 버튼을 클릭할 때 새로운 난수값 생성 후 중복 체크 후 dictionary<>에 저장
private void button1_Click(object sender, EventArgs e)
        {
            int num = rand.Next(10);

            foreach (var item in key)
            {
                if (item.Key == num)
                {
                    dataGridView1.Rows.Add(num, "is already in use");
                    button1_Click(sender, e);
                }
            }

            key.Add(num, "new");
            dataGridView1.Rows.Add(num, "new");
        }

[실행 화면 & 오류]

  • 초기화면

초기 화면

바로 실행 시 입력해둔 초기값들이 dgv에 보인다.

  • 버튼 누를 시(정상 작동 - 중복값 없음)

버튼 눌렀을 때

만약 중복이 안일어날시, 새롭게 추가가 정상적으로 일어나는 것을 확인 할 수 있음

  • 버튼 누를시(오류 발생 - 중복값 있음)

함수 안에서 재귀형식으로 이벤트 처리를 해서 재귀호출 후 key dictionary가 변경이 된 상태로 저장이 되고 다시 재귀 호출을 빠져나왔을때 오류가 발생하는거 같다 ㅜㅜ


[오류 해결과정]

  • break문(여전히 오류)
private void button1_Click(object sender, EventArgs e)
        {
            int num = rand.Next(10);

            foreach (var item in key)
            {
                if (item.Key == num)
                {
                    dataGridView1.Rows.Add(num, "is already in use");
                    button1_Click(sender, e);
                    break;
                }
            }

            key.Add(num, "new");
            dataGridView1.Rows.Add(num, "new");
        }

근데 break문을 넣게 되면 이런 오류가 발생함

당연함.. 왜냐하면 이미 재귀호출된 함수에서 Add 를 한 상태로 foreach 문 빠져나오고 또 똑같은 업데이트된 num을 key로 저장하려니 오류가 발생할 수 밖에..

그래서 다음 방법!

  • return문 넣어서 함수 종료시켜버리기
private void button1_Click(object sender, EventArgs e)
        {
            int num = rand.Next(10);

            foreach (var item in key)
            {
                if (item.Key == num)
                {
                    dataGridView1.Rows.Add(num, "is already in use");
                    button1_Click(sender, e);
                    return;
                }
            }

            key.Add(num, "new");
            dataGridView1.Rows.Add(num, "new");
        }

아까 break문 추가한 부분을 return문으로 바꿔서 실행해보자!!

그러면 정상적으로 실행된다!!

이렇게 새로 추가되는거는 new로 추가되는게 보이고 기존 key값과 중복이 나타나는 거는 "is already in use"로 표시되고 바로 재귀호출 사용해서 새로운 key값이 나올때까지 돌아간다!

한마디로 버튼 한번 누르면 new가 입력될때까지 루프가 돈다는 뜻(=아주 잘 처리했다는 뜻)

 

728x90

'study > 코딩' 카테고리의 다른 글

[c# 개념] Action과 Func  (0) 2023.05.30
[c# 개념] 람다식(Lambda Expression)  (0) 2023.05.30
[c# 개념] enum(열거형)  (0) 2023.05.30
[c# 개념] struct 와 class의 차이  (0) 2023.05.30
[winform] RSA 암호화, 복호화 소프트웨어  (0) 2023.05.30