본문 바로가기
팁 & 노하우/C#

C# 차집합, 교집합, 합집합을 활용한 프로그램 예제

by 대디동동 2023. 9. 29.
728x90

이번 시간에는 간단한 품번 비교 프로그램을 만들어 보겠습니다.

 

회사에서 업무를 하다가 동료로부터 Sheet1에 있는 품목 번호와 Sheet2에 있는 품목 번호를 비교해야 하는데

쉬운 방법이 있는지 문의를 받은 적이 있습니다.

 

두 개의 쉬트에서 약 800개의 자료를 비교해야 하는데, 일일이 대조하는 것은 거의 불가능하고

설령 눈으로 비교했더라도 완벽한지는 장담할 수 없는 상황입니다.

 

그래서, 간단하게 텍스트를 비교하는 프로그램을 만들어서 일을 도와드린 적이 있는데

그때 사용한 프로그램을 같이 만들어 보기로 하겠습니다.


1. 프로젝트 생성

  • Visual Studio 2022를 이용해서 Windows Forms 앱 (.Net Framework) 프로젝트 만들기
  • 프로젝트 명, 작업 디렉토리 선택 후 "만들기" 클릭

Windows Foms 앱(.Net Framework) 프로젝트 생성하기Windows Foms 앱(.Net Framework) 프로젝트 생성하기Windows Foms 앱(.Net Framework) 프로젝트 생성하기
Windows Foms 앱(.Net Framework) 프로젝트 생성하기

 

2. 프로그램 개발 목표

  • A, B 두 그룹의 텍스트를 비교해서
    • A 그룹에만 있는 항목 표시 (A 차집합 구하기)
    • B 그룹에만 있는 항목 표시 (B 차집합 구하기)

3. 화면 디자인

  • A 그룹 텍스트 입력용 TextBox 1개
  • B 그룹 텍스트 입력용 TextBox 1개
  • A 차집합 결과 표시용 TextBox 1개
  • B 차집합 결과 표시용 TextBox 1개
  • 실행 버튼 1개를 만들어서 배치한다.
  • 입력을 편리하게 하기 위해 TextBox는 Multiline, Scrollbar=Vertical을 설정한다.

기능 구현을 위한 폼 디자인
기능 구현을 위한 폼 디자인

 

4. 프로그램 구현 (코딩)

  • 차집합을 구하는 문제는 List의 Except 메서드를 사용하면 쉽게 구할 수 있다.
  • 교집합을 구하는 문제는 List의 Intersect 메서드를 사용하면 쉽게 구할 수 있다.
  • 합집합을 구하는 문제는 List의 Union 메서드를 사용하면 쉽게 구할 수 있다.
  • List 이용하여 대소문자 구분하지 않는 StringComparer.OrdinalIgnoreCase를 사용한다.
  • 엑셀에서 행 단위 문자열은 Split을 이용하되 엔터키 값을 이용하여 분리한다.  
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace TextCompare
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //비교 텍스트 박스 초기화
            txtGroupA.Text = string.Empty;
            txtGroupB.Text = string.Empty;

            //결과 텍스트 박스 초기화
            txtResultA.Text = string.Empty;
            txtResultB.Text = string.Empty;
        }

        private void btnAct_Click(object sender, EventArgs e)
        {
            //결과 텍스트 박스 초기화
            txtResultA.Text = string.Empty;
            txtResultB.Text = string.Empty;

            List<string> lstSources = new List<string>();
            List<string> lstTargets = new List<string>();

            string sourceTxt = txtGroupA.Text;
            string targetTxt = txtGroupB.Text;

            //엔터키 값을 기준으로 배열로 분리한다.
            string[] arrSourceTxt = sourceTxt.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);
            string[] arrTargetTxt = targetTxt.Split(new string[] { "\n", "\r\n" }, StringSplitOptions.RemoveEmptyEntries);

            //배열 값을 반복하며 List에 저장한다.
            foreach (string sItem in arrSourceTxt)
            {
                string sTxt = sItem.Trim(); //좌우 공백을 없앤다

                if (!string.IsNullOrWhiteSpace(sTxt))
                {
                    lstSources.Add(sTxt);
                }
            }

            //배열 값을 반복하면 List에 저장한다.
            foreach (string tItem in arrTargetTxt)
            {
                string tTxt = tItem.Trim(); //좌우 공백을 없앤다

                if (!string.IsNullOrWhiteSpace(tTxt))
                {
                    lstTargets.Add(tTxt);
                }
            }

            //List Except를 사용하여 차집합을 구한다.
            List<string> lstSourceResults = lstSources.Except(lstTargets, StringComparer.OrdinalIgnoreCase).ToList();

            //차집합 결과값은 결과 텍스트 박스에 표시한다.
            foreach (var item in lstSourceResults)
            {
                txtResultA.Text += item + "\r\n"; //엔터키를 통해서 줄 구분
            }

            //List Except를 사용하여 차집합을 구한다.
            List<string> lstTargetResults = lstTargets.Except(lstSources, StringComparer.OrdinalIgnoreCase).ToList();

            //차집합 결과값은 결과 텍스트 박스에 표시한다.
            foreach (var item in lstTargetResults)
            {
                txtResultB.Text += item + "\r\n"; //엔터키를 통해서 줄 구분
            }
        }
    }
}

 

5. 결과 확인

결과 값 확인
결과 값 확인


오늘의 개발 팁

List 차집합 = Except
List 교집합 = Intersect
List 합집합 = Union

대소문자 무시하고 비교 = StringComparer.OrdinalIgnoreCase

이번 시간에는 간단하게 텍스트를 비교해서 차집합을 구하는 방법을

C# 윈폼(Winform)을 이용해서 프로그램을 만들어 보았습니다.

 

위에서 언급한 것과 같이 문자열 목록을 비교하는 많은 방법이 있지만

List를 이용하면 쉽게 구할 수 있으니 참고해 주세요.

 

첨부된 파일을 참고해서 각자가 원하는 대로 수정해서 개발해 보세요.

TextCompare.zip
0.06MB

 

반응형