C#
에서 Enumerable
형식의 데이터에서 중복을 없앨 때는 Distinct
를 사용합니다.
public static System.Collections.Generic.IEnumerable<TSource> Distinct<TSource> (this System.Collections.Generic.IEnumerable<TSource> source);
원형은 위와 같습니다.
이것을 사용해보겠습니다.
List<int> list = new List<int> { 1, 2, 3, 4, 4, 4, 5, 6 };
list.Distinct().ToList().ForEach(num =>
{
System.Console.Write($"{num} ");
});
System.Console.WriteLine();
double[] dArr = new double[] { 1.2, 3.3, 3.3, 3.3, 4.8, 4.8, 6.5 };
dArr.Distinct().ToList().ForEach(num =>
{
System.Console.Write($"{num} ");
});
System.Console.WriteLine();
(간단하게 출력을 위해 List
로 변환 후 ForEach
를 사용하였습니다.)
이렇게 중복이 잘 제거된 것을 볼 수 있습니다.
Custom Class의 Distinct 사용
위에 있던 int
, double
, string
과 같은 Primitive 자료형
이 아닌 직접 선언한 클래스를 사용할 때 Distinct
를 사용하기 위해서는 IEquatable 인터페이스
를 정의해주어야 합니다.
public class Human : IEquatable<Human> // <-- IEquatable<클래스명> 상속
{
public string Name { get; set; } = string.Empty;
public int Age { get; set; } = 0;
// Equals 정의
public bool Equals(Human other)
{
return true;
}
// GetHashCode Override
public override int GetHashCode()
{
return base.GetHashCode();
}
};
Equals
와 GetHashCode
함수를 정의해주겠습니다.
public class Human : IEquatable<Human>
{
public string Name { get; set; } = string.Empty;
public int Age { get; set; } = 0;
public bool Equals(Human other)
{
if (ReferenceEquals(other, null))
return false;
if (ReferenceEquals(this, other))
return true;
return Age == other.Age && Name.Equals(other.Name);
}
public override int GetHashCode()
{
int hashProductName = Name == null ? 0 : Name.GetHashCode();
int hashProductCode = Age.GetHashCode();
return hashProductName ^ hashProductCode;
}
};
이제 이 Class
를 가지고 Distinct
를 수행해보겠습니다.
List<Human> list = new List<Human>
{
new Human { Name = "Hong", Age = 30 },
new Human { Name = "Hong", Age = 30 },
new Human { Name = "Kim", Age = 30 },
new Human { Name = "Jeon", Age = 55 },
new Human { Name = "Koo", Age = 55 }
};
list.Distinct().ToList().ForEach(human =>
{
System.Console.WriteLine($"{human.Name} : {human.Age}");
});
참고 자료
'Study > C#, Winform' 카테고리의 다른 글
[C# Winform] DataGridView Column Header Drag (컬럼 헤더 드래그) (0) | 2022.10.24 |
---|---|
[C#] DateTime 시간 자르기, 반올림, 반내림, 가까운 값 (1) | 2022.10.11 |
[C# Winform] 스크롤바 크기 (넓이) (0) | 2022.10.04 |
[C# Winform] Context Menu를 Button 옆에 띄우기 (0) | 2022.09.28 |
[C#] MemoryStream, StreamWriter, StreamReader, BinaryWriter, BinaryReader (1) | 2022.08.16 |