Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> C#

Lấy enumerator duyệt SortedSet trong C#

Giới thiệu

SortedSet<T> là tập hợp (set) tự động sắp xếp và không trùng lặp. Implement IEnumerable<T>, cung cấp GetEnumerator() trả về SortedSet<T>.Enumerator (struct) để duyệt theo thứ tự tăng dần.

Ví dụ 1: Duyệt SortedSet với foreach và Enumerator thủ công

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main()
    {
        SortedSet set1 = new SortedSet();
        set1.Add("AB");
        set1.Add("BC");
        set1.Add("CD");
        set1.Add("EF");

        Console.WriteLine("Set1 (foreach):");
        foreach (string s in set1)
        {
            Console.WriteLine(s);
        }

        SortedSet set2 = new SortedSet();
        set2.Add("BC");
        set2.Add("CD");
        set2.Add("DE");
        set2.Add("EF");
        set2.Add("AB");
        set2.Add("HI");
        set2.Add("JK");

        Console.WriteLine("\nSet2 (Enumerator thủ công):");
        SortedSet.Enumerator enumr = set2.GetEnumerator();
        while (enumr.MoveNext())
        {
            Console.WriteLine(enumr.Current);
        }
    }
}

Kết quả

Set1 (foreach):
AB
BC
CD
EF

Set2 (Enumerator thủ công):
AB
BC
CD
DE
EF
HI
JK

Ví dụ 2: SortedSet với Enumerator

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main()
    {
        SortedSet set = new SortedSet();
        set.Add(100);
        set.Add(200);
        set.Add(300);
        set.Add(400);
        set.Add(500);
        set.Add(600);
        set.Add(700);

        Console.WriteLine("SortedSet (Enumerator):");
        SortedSet.Enumerator enumr = set.GetEnumerator();
        while (enumr.MoveNext())
        {
            Console.WriteLine(enumr.Current);
        }
    }
}

Kết quả

SortedSet (Enumerator):
100
200
300
400
500
600
700

Đặc điểm Enumerator của SortedSet

  • Là **struct** (value type) -> tránh allocation heap khi dùng foreach.
  • Chỉ đọc (read-only), không hỗ trợ Remove.
  • Duyệt theo thứ tự **tăng dần** (theo IComparer<T> hoặc mặc định).
  • Phiên bản .NET Core/.NET 5+ tối ưu hơn .NET Framework.

Lưu ý khi dùng

  • Không sửa đổi SortedSet trong khi đang enumerate (InvalidOperationException).
  • Nếu cần xóa khi duyệt, hãy dùng for lùi hoặc tập hợp các item cần xóa rồi xóa sau.
  • SortedSet không cho phép trùng lặp, Add trả về false nếu đã tồn tại.

So sánh với HashSet

Đặc điểmHashSet<T>SortedSet<T>
Thứ tựKhông đảm bảoTăng dần (sorted)
Phức tạp Add/ContainsO(1) trung bìnhO(log n)
Bộ nhớThấp hơnCao hơn (cây nhị phân)
EnumeratorStructStruct