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 ถูกกรองทิ้ง)