C# // IComarable
개체의 값의 비교를 위해 정의된 인터페이스이다. C# 대부분의 컬렉션들은(LIST,ARRAY 등) 보통 Sort 메서드를 제공하는데 IComarable 인터페이스 기반의 요소를 보관하고 있을 때 정상적으로 동작하고 그렇자 읺으면 예외를 발생한다. 또한, C#의 System에 정의되어 있는 기본 형식들은 IComarable 인터페이스를 기반으로 정의되어 있어서 기본 형식을 보관한 컬렉션은 Sort 메서드를 정렬할 수 있다.
public class Car : IComparable<Car>
{
public int Year;
public string Make;
public int CompareTo(Car other)
{
return this.Year - other.Year; // Ascending by Year
}
}
위의 Car와 같이 사용자 정의 객체를 정렬 혹은 비교하고 싶을 경우, IComparable 인터페이스에서 상속받은 후 기본으로 비교하려는 값으로 CompareTo메소드를 정의하면 된다.
C# IComparer
int 형식을 저장하고 있는 배열이 있고, 그 배열의 Sort 메서드를 호출 할 경우에는 정렬하는 과정에서 각 숫자를 비교하는 기본 동작을 제공한다. int 형식의 기본 비교 로직은 IComparable 인터페이스를 상속하여 내림차순으로 구현된다. 이때 기본 비교 로직을 변경할 수 없을때 자신이 만든 로직을 사용하여 두개의 객체를 비교하기 위해 필요한 것이 IComparer 인터페이스이다.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace _1181
{
class Program
{
class Comparer : IComparer<string>
{
public int Compare(string x, string y)
{
if (x.Length == y.Length)
return x.CompareTo(y);
return x.Length.CompareTo(y.Length);
}
}
static void Main(string[] args)
{
var N = int.Parse(Console.ReadLine());
List<string> arr = new List<string>();
if (N >= 1 && N <= 20000)
{
for (int i = 0; i < N; i++)
{
var input = Console.ReadLine();
arr.Add(input);
}
}
arr = arr.Distinct().ToList();
arr.Sort(new Comparer());
foreach (var word in arr)
{
Console.WriteLine(word);
}
}
}
}
해당 코드는 BOJ 1181번 단어정렬 문제의 코드이다. Compare는 비교 로직의 변경위해 사용하였고, 아래로는 distinct() 메서드를 활용하여 중복값을 제거했습니다. c# 에서는 배열값을 제거할 수 없기때문에 Distinct()를 사용하여 중복값이 없는 새로운 배열을 만들어냅니다.
그 후에 sort() 메서드를 이용하여 변경한 로직을 사용하여 배열을 정렬시킨 후에 foreach 문으로 모두 출력해주었습니다.
class Comparer : IComparer<string>
{
public int Compare(string x, string y)
{
if (x.Length == y.Length)
return x.CompareTo(y);
return x.Length.CompareTo(y.Length);
}
}
C# Dictionary
'C#' 카테고리의 다른 글
ASP.NET - MapPath, Application, Session (0) | 2022.12.13 |
---|---|
C# Asp .net Web Form 학급 관리 프로젝트 - 02. (0) | 2022.12.07 |
C# Asp .net Web Form 학급 관리 프로젝트 - 01. (0) | 2022.11.30 |
22.11.30 C# 일지_5 (0) | 2022.11.30 |
Asp .Net Web Forms - 04. CRUD 구현 (0) | 2022.11.29 |