728x90
반응형
728x170
■ IEnumerable<T> 인터페이스를 사용해 열거 가능형에서 중복 항목을 제거하는 방법을 보여준다.
▶ Item.cs
namespace TestProject;
/// <summary>
/// 항목
/// </summary>
public class Item
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Property
////////////////////////////////////////////////////////////////////////////////////////// Public
#region ID - ID
/// <summary>
/// ID
/// </summary>
public int ID { get; set; }
#endregion
#region 명칭 - Name
/// <summary>
/// 명칭
/// </summary>
public string Name { get; set; }
#endregion
#region 코드 - Code
/// <summary>
/// 코드
/// </summary>
public string Code { get; set; }
#endregion
#region 가격 - Price
/// <summary>
/// 가격
/// </summary>
public int Price { get; set; }
#endregion
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Public
#region 해시 코드 구하기 - GetHashCode()
/// <summary>
/// 해시 코드 구하기
/// </summary>
/// <returns>해시 코드</returns>
public override int GetHashCode()
{
return $"{ID}|{Name}|{Code}|{Price}".GetHashCode();
}
#endregion
#region 동일 여부 구하기 - Equals(source)
/// <summary>
/// 동일 여부 구하기
/// </summary>
/// <param name="source">소스 객체</param>
/// <returns>동일 여부</returns>
public override bool Equals(object source)
{
if(!(source is Item))
{
return false;
}
Item sourceItem = (Item)source;
return sourceItem.ID == ID &&
sourceItem.Name == Name &&
sourceItem.Code == Code &&
sourceItem.Price == Price;
}
#endregion
#region 문자열 구하기 - ToString()
/// <summary>
/// 문자열 구하기
/// </summary>
/// <returns>문자열</returns>
public override string ToString()
{
return $"ID={ID};Name={Name};Code={Code};Price={Price}";
}
#endregion
}
▶ EnumerableExtension.cs
namespace TestProject;
/// <summary>
/// 열거 가능형 확장
/// </summary>
public static class EnumerableExtension
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Public
#region 중복 제거하기 - DistinctBy<TItem, TKey>(sourceEnumerable, keySelector)
/// <summary>
/// 중복 제거하기
/// </summary>
/// <typeparam name="TItem">항목 타입</typeparam>
/// <typeparam name="TKey">키 타입</typeparam>
/// <param name="sourceEnumerable">소스 열거 가능형</param>
/// <param name="keySelector">키 셀렉터</param>
/// <returns>중복 제거 후 열거 가능형</returns>
public static IEnumerable<TItem> DistinctBy<TItem, TKey>(this IEnumerable<TItem> sourceEnumerable, Func<TItem, TKey> keySelector)
{
return sourceEnumerable.GroupBy(keySelector).Select(grp => grp.First());
}
#endregion
}
▶ Program.cs
namespace TestProject;
/// <summary>
/// 프로그램
/// </summary>
class Program
{
//////////////////////////////////////////////////////////////////////////////////////////////////// Method
////////////////////////////////////////////////////////////////////////////////////////// Static
//////////////////////////////////////////////////////////////////////////////// Private
#region 프로그램 시작하기 - Main()
/// <summary>
/// 프로그램 시작하기
/// </summary>
private static void Main()
{
List<Item> sourceList = new List<Item>();
sourceList.Add(new Item { ID = 1, Name = "항목1", Code = "CODE1", Price = 100});
sourceList.Add(new Item { ID = 1, Name = "항목1", Code = "CODE1", Price = 100});
sourceList.Add(new Item { ID = 2, Name = "항목2", Code = "CODE2", Price = 200});
sourceList.Add(new Item { ID = 2, Name = "항목2", Code = "CODE2", Price = 200});
sourceList.Add(new Item { ID = 3, Name = "항목3", Code = "CODE3", Price = 300});
IEnumerable<Item> resultEnumerable = sourceList.DistinctBy(item => item.ID);
foreach(Item item in resultEnumerable)
{
Console.WriteLine(item);
}
}
#endregion
}
728x90
반응형
그리드형(광고전용)
'C# > Common' 카테고리의 다른 글
[C#/COMMON/.NET6] String 클래스 : 공백 문자 제거하기 (0) | 2022.10.14 |
---|---|
[C#/COMMON/.NET6] Char 구조체 : IsWhiteSpace 정적 메소드를 사용해 공백 문자 제거하기 (0) | 2022.10.14 |
[C#/COMMON/.NET6] Regex 클래스 : Replace 정적 메소드를 사용해 공백 문자 제거하기 (0) | 2022.10.14 |
[C#/COMMON/.NET6] DateTime 구조체 : 밀리초 정밀도 포맷 문자열 사용하기 (0) | 2022.10.14 |
[C#/COMMON/.NET6] 2의 거듭 제곱 여부 구하기 (0) | 2022.10.14 |
[C#/COMMON/.NET6] object 클래스 : GetHashCode/Equals 메소드를 사용해 열거 가능형에서 중복 항목 제거하기 (0) | 2022.10.12 |
[C#/COMMON/.NET6] IEqualityComparer<T> 인터페이스 : 열거 가능형에서 중복 항목 제거하기 (0) | 2022.10.12 |
[C#/COMMON/.NET6] IEnumerable<T> 인터페이스 : 열거 가능형 임의로 섞기 (0) | 2022.10.12 |
[C#/COMMON/.NET6] List<T> 클래스 : 리스트 임의로 섞기 (0) | 2022.10.12 |
[C#/COMMON/.NET6] IEnumerable<T> 인터페이스 : 열거 가능형 임의로 섞기 (0) | 2022.10.12 |
댓글을 달아 주세요