Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

สร้าง HashSet จากคอลเลกชันอื่นใน C#

Constructor HashSet<T>(IEnumerable<T> collection) สร้าง HashSet ใหม่โดยคัดลอกองค์ประกอบจากคอลเลกชันที่ระบุ โดยอัตโนมัติกรองค่าซ้ำ (Duplicate Removal)

ตัวอย่างที่ 1: สร้างจาก HashSet อื่น (int)

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main()
    {
        HashSet<int> set1 = new HashSet<int>();
        set1.Add(100);
        set1.Add(200);
        set1.Add(300);

        Console.WriteLine("HashSet ต้นฉบับ...");
        foreach (int i in set1)
        {
            Console.WriteLine(i);
        }

        // สร้าง HashSet ใหม่จาก set1
        HashSet<int> set2 = new HashSet<int>(set1);

        Console.WriteLine("HashSet สร้างจากคอลเลกชันอื่น...");
        foreach (int i in set2)
        {
            Console.WriteLine(i);
        }
    }
}

ผลลัพธ์

HashSet ต้นฉบับ...
100
200
300
HashSet สร้างจากคอลเลกชันอื่น...
100
200
300

ตัวอย่างที่ 2: สร้างจาก HashSet ที่มีค่าซ้ำ (อัตโนมัติกรองซ้ำ)

using System;
using System.Collections.Generic;

public class Demo
{
    public static void Main()
    {
        HashSet<string> set1 = new HashSet<string>();
        set1.Add("Jacob");
        set1.Add("Tom");
        set1.Add("Harry");
        set1.Add("Harry"); // ซ้ำ
        set1.Add("Tom");   // ซ้ำ
        set1.Add("Harry"); // ซ้ำ

        Console.WriteLine("HashSet ต้นฉบับ (มีการ Add ซ้ำ)...");
        foreach (string i in set1)
        {
            Console.WriteLine(i);
        }

        // สร้าง HashSet ใหม่จาก set1 (ซ้ำแล้วถูกกรอง)
        HashSet<string> set2 = new HashSet<string>(set1);

        Console.WriteLine("HashSet สร้างจากคอลเลกชันอื่น...");
        foreach (string i in set2)
        {
            Console.WriteLine(i);
        }
    }
}

ผลลัพธ์ (ค่าถูกกรองซ้ำอัตโนมัติ)

HashSet ต้นฉบับ (มีการ Add ซ้ำ)...
Jacob
Tom
Harry
HashSet สร้างจากคอลเลกชันอื่น...
Jacob
Tom
Harry

สร้าง HashSet จากคอลเลกชันอื่นๆ

// จาก List<T>
var list = new List<int> { 1, 2, 2, 3, 3, 3, 4 };
var setFromList = new HashSet<int>(list); // {1, 2, 3, 4}

// จาก Array
int[] arr = { 5, 5, 6, 7, 7, 8 };
var setFromArray = new HashSet<int>(arr); // {5, 6, 7, 8}

// จาก LINQ Query
var numbers = Enumerable.Range(1, 10);
var evenSet = new HashSet<int>(numbers.Where(x => x % 2 == 0)); // {2, 4, 6, 8, 10}

// จากคอลเลกชัน Non-Generic (ต้อง Cast)
ArrayList oldList = new ArrayList { "A", "B", "A", "C" };
var setFromOld = new HashSet<string>(oldList.Cast<string>()); // {A, B, C}

Constructor Overloads ของ HashSet<T>

Constructorคำอธิบาย
HashSet()สร้างว่าง ใช้ Default Comparer
HashSet(int capacity)สร้างว่าง ระบุ Capacity เริ่มต้น
HashSet(IEnumerable<T>)สร้างจากคอลเลกชันอื่น (กรองซ้ำอัตโนมัติ)
HashSet(IEnumerable<T>, IEqualityComparer<T>)สร้างจากคอลเลกชัน + Comparer แบบกำหนดเอง
HashSet(IEqualityComparer<T>)สร้างว่าง + Comparer แบบกำหนดเอง
HashSet(int capacity, IEqualityComparer<T>)สร้างว่าง + Capacity + Comparer

ข้อสังเกตสำคัญ

  • Constructor นี้ กรองค่าซ้ำอัตโนมัติ (Set Property)
  • ลำดับของสมาชิกใน HashSet ไม่ได้รับการรับประกัน (Unordered)
  • หากต้องการรักษาลำดับ ใช้ List<T>.Distinct() หรือ OrderedSet (Third-party)
  • Complexity: O(n) โดยประมาณ (n = จำนวนสมาชิกในคอลเลกชันต้นทาง)
  • ใช้ IEqualityComparer<T> เพื่อกำหนดความเท่าเทียมเอง (เช่น Case-Insensitive String)

ตัวอย่าง: Case-Insensitive HashSet

var names = new List<string> { "John", "JOHN", "john", "Jane" };
var caseInsensitiveSet = new HashSet<string>(names, StringComparer.OrdinalIgnoreCase);
// ผลลัพธ์: {"John", "Jane"} (JOHN, john ถูกกรองทิ้ง)