본문 바로가기
Programming/C#

[C#] 클래스 멤버 간 데이터 비교 - IEqualityComparer

by 타임박스 2020. 11. 17.
반응형


✔  Object Member Compare

클래스 안 멤버 비교 - 변경된 데이터가 있는 사항만 추출

 



 

작업을 하다보면 클래스를 비교하는 일이 아닌 클래스간 데이터를 비교해야하는 일이 많이 발생한다.

그리고 이전에 받은 정보와 새로 받은 정보가 일치할 경우에는 내용을 업데이트 시킬 필요가 없고, 변경된 사항에만 업데이트를 시키면 된다. 이론적으로는 알겠는데 어떻게 구현해야할까.

일반적으로 클래스비교는 object.Equals 함수를 통해 클래스 비교한다.

하지만 두개의 새로운 클래스를 비교할 경우 데이터는 같아도 object.Equals에서 false를 반환한다.

두 클래스간에 멤버 값이 변경된 사항이 있는지 확인하는 방법은 IEqualityComparer<T> 인터페이스를 활용하면 된다.

예제는 다음과 같다.

using System;
using System.Collections.Generic;
using System.Linq;

namespace Test
{
    class Program
    {
    	//데이터 비교 클래스
        public class DataCompare : IEqualityComparer<Student>
        {
            public bool Equals(Student x, Student y)
            {
                if (string.Equals(x.Age.ToString(), y.Age.ToString(), StringComparison.OrdinalIgnoreCase) 
                    && string.Equals(x.name, y.name, StringComparison.OrdinalIgnoreCase)
                    && string.Equals(x.score.ToString(), y.score.ToString(), StringComparison.OrdinalIgnoreCase))
                {
                    return true;
                }
                return false;
            }
            

            public int GetHashCode(Student obj)
            {
                return obj.name.GetHashCode();
            }
        }
		
        public class Student
        {
            public int Age { get; set; }
            public string name { get; set; }
            public int score { get; set; }
        }

        static void Main(string[] args)
        {
            //기존 데이터
            List<Student> old_data = new List<Student>()
            {
                new Student { Age = 19, name = "Tom" , score = 30},
                new Student { Age = 22, name = "Zeri" , score = 30},
                new Student { Age = 18, name = "Bob" , score = 30},
                new Student { Age = 20, name = "Ami" , score = 50},
            };
            //신규 데이터
            List<Student> new_data = new List<Student>()
            {
                new Student { Age = 19, name = "Tom" , score = 30},         //기존데이터 동일
                new Student { Age = 18, name = "Zeri" , score = 30},        //Age 데이터 갱신
                new Student { Age = 18, name = "Rora" , score = 30},        //새로운 데이터 추가
                new Student { Age = 19, name = "Ami" , score = 30}         //Score, Age 데이터 갱신
                //new Student { Age = 18, name = "Bob" , score = 30},      //Bob 데이터 삭제
            };

            //변경된 신규데이터
            List<Student> newChange = new_data.Except(old_data, new DataCompare()).ToList();
            //기존데이터에서 변경된 항목
            List<Student> oldChange = old_data.Except(new_data, new DataCompare()).ToList();
          
            Console.WriteLine("< 새로 변경된 데이터 >");
            foreach (var item in newChange)
            {
                Console.WriteLine("Age : " +  item.Age);
                Console.WriteLine("name : " + item.name);
                Console.WriteLine("score : " + item.score);
                Console.WriteLine("============================================");
            }
            Console.WriteLine();
            Console.WriteLine("< 기존 데이터 변경사항 >");
            foreach (var item in oldChange)
            {
                Console.WriteLine("Age : " + item.Age);
                Console.WriteLine("name : " + item.name);
                Console.WriteLine("score : " + item.score);
                Console.WriteLine("============================================");
            }
        }
    }
}

 

<그림 1> 결과 화면

반응형

댓글