C# 팁: SortedSet를 사용하여 중복을 방지하고 항목을 정렬합니다.

14356 단어 csharp
아시다시피 HashSet<T> 개체를 사용하여 중복 없이 항목 모음을 만들 수 있습니다.

동일한 유형의 항목 목록에서 중복 항목을 제거하는 것은 매우 유용합니다.

항목을 항상 정렬했는지 어떻게 확인할 수 있습니까? 답은 간단합니다. SortedSet<T> !

HashSet: 중복이 없는 컬렉션



단순HashSet은 중복 없이 정렬되지 않은 항목 모음을 만듭니다.

이 예

var hashSet = new HashSet<string>();
hashSet.Add("Turin");
hashSet.Add("Naples");
hashSet.Add("Rome");
hashSet.Add("Bari");
hashSet.Add("Rome");
hashSet.Add("Turin");


var resultHashSet = string.Join(',', hashSet);
Console.WriteLine(resultHashSet);


다음 문자열을 출력합니다: Turin,Naples,Rome,Bari. 삽입된 항목의 순서는 유지됩니다.

SortedSet: 중복이 없는 정렬된 컬렉션



이러한 항목을 정렬하기 위해 두 가지 접근 방식이 있습니다.

항목 추가를 완료하면 컬렉션을 간단히 정렬할 수 있습니다.

var hashSet = new HashSet<string>();
hashSet.Add("Turin");
hashSet.Add("Naples");
hashSet.Add("Rome");
hashSet.Add("Bari");
hashSet.Add("Rome");
hashSet.Add("Turin");

var items = hashSet.ToList<string>().OrderBy(s => s);


var resultHashSet = string.Join(',', items);
Console.WriteLine(resultHashSet);



또는 더 좋은 방법은 올바른 데이터 구조를 사용하는 것입니다. aSortedSet<T>
var sortedSet = new SortedSet<string>();

sortedSet.Add("Turin");
sortedSet.Add("Naples");
sortedSet.Add("Rome");
sortedSet.Add("Bari");
sortedSet.Add("Rome");
sortedSet.Add("Turin");


var resultSortedSet = string.Join(',', sortedSet);
Console.WriteLine(resultSortedSet);


두 결과 모두 Bari,Naples,Rome,Turin을 인쇄합니다. 그러나 두 번째 접근 방식은 전체 목록을 정렬할 필요가 없습니다. 시간과 메모리 측면에서 더 효율적입니다.

맞춤 정렬 규칙 사용


SortedSet 와 같은 사용자 정의 개체와 함께 User 를 사용하려면 어떻게 해야 합니까?

public class User { 
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public User(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }
}


물론 다음과 같이 할 수 있습니다.

var set = new SortedSet<User>();

set.Add(new User("Davide", "Bellone"));
set.Add(new User("Scott", "Hanselman"));
set.Add(new User("Safia", "Abdalla"));
set.Add(new User("David", "Fowler"));
set.Add(new User("Maria", "Naggaga"));
set.Add(new User("Davide", "Bellone"));//DUPLICATE!

foreach (var user in set)
{
    Console.WriteLine($"{user.LastName} {user.FirstName}");
}


그러나 오류가 발생합니다. 우리 클래스는 사물을 비교하는 방법을 모릅니다!

이것이 User 인터페이스를 구현하도록 IComparable 클래스를 업데이트해야 하는 이유입니다.

public class User : IComparable
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public User(string firstName, string lastName)
    {
        FirstName = firstName;
        LastName = lastName;
    }

    public int CompareTo(object obj)
    {
        var other = (User)obj;
        var lastNameComparison = LastName.CompareTo(other.LastName);

        return (lastNameComparison != 0)
            ? lastNameComparison :
            (FirstName.CompareTo(other.FirstName));
    }
}


이런 식으로 모든 것이 예상대로 작동합니다.

Abdalla Safia
Bellone Davide
Fowler David
Hanselman Scott
Naggaga Maria


두 번째 Davide Bellone은 복제품이므로 사라졌습니다.

이 기사는 Code4IT에 처음 게재되었습니다.

마무리



강력하고 성능이 뛰어난 애플리케이션을 구축하려면 올바른 데이터 유형을 선택하는 것이 중요합니다.

이 문서에서는 SortedSet를 사용하여 컬렉션에 항목을 삽입하고 항목이 중복 없이 정렬되도록 했습니다.

나는 그것을 프로젝트에서 사용한 적이 없습니다. 그래서 내가 그걸 어떻게 알았지? 방금 내가 사용하고 있던 라이브러리를 탐색했습니다!

때때로 몇 분 동안 문서를 읽고 가장 일반적인 라이브러리를 살펴보는 등의 작업을 수행하십시오. 존재한다고 생각하지 못한 많은 항목을 찾을 수 있습니다!

당신의 코드로 장난감! 그것을 탐험하십시오. 호기심을 가지세요.

그리고 재미있게 보내세요!

🐧

좋은 웹페이지 즐겨찾기