คุณสมบัติ Keys ของ Dictionary<TKey, TValue> คืนค่า Dictionary<TKey, TValue>.KeyCollection ซึ่งเป็น Collection ที่สามารถวนลูปได้ แปลงเป็น List/Array ได้ง่าย เพื่อนำ Keys ไปใช้งานต่อ
รูปแบบการใช้งาน
Dictionary dict = new Dictionary { {1, "One"}, {2, "Two"} };
List keys = new List(dict.Keys); // แปลงเป็น List
int[] keysArray = dict.Keys.ToArray(); // แปลงเป็น Array (LINQ)
โค้ดตัวอย่างสมบูรณ์
using System;
using System.Collections.Generic;
using System.Linq;
public class Demo
{
public static void Main()
{
Dictionary dict = new Dictionary
{
{ 1, "One" }, { 2, "Two" }, { 3, "Three" },
{ 4, "Four" }, { 5, "Five" }, { 6, "Six" },
{ 7, "Seven" }, { 8, "Eight" }
};
Console.WriteLine("Dictionary:");
foreach (var kvp in dict)
Console.WriteLine($" [{kvp.Key}] = {kvp.Value}");
// 1. แปลงเป็น List
List keysList = new List(dict.Keys);
Console.WriteLine($"\nKeys เป็น List: {string.Join(", ", keysList)}");
// 2. แปลงเป็น Array (LINQ)
int[] keysArray = dict.Keys.ToArray();
Console.WriteLine($"Keys เป็น Array: {string.Join(", ", keysArray)}");
// 3. วนลูปโดยตรง (ไม่ต้องแปลง)
Console.WriteLine("\nวนลูป Keys โดยตรง:");
foreach (int key in dict.Keys)
Console.WriteLine($" Key: {key}");
// 4. ใช้ LINQ กรอง/เรียง Keys
Console.WriteLine("\nKeys ที่เป็นเลขคู่ (เรียงมากไปน้อย):");
var evenKeys = dict.Keys.Where(k => k % 2 == 0).OrderByDescending(k => k);
Console.WriteLine(string.Join(", ", evenKeys)); // 8, 6, 4, 2
// 5. ตรวจสอบ Key มีอยู่
Console.WriteLine($"\nมี Key 5: {dict.Keys.Contains(5)}"); // True
Console.WriteLine($"มี Key 99: {dict.Keys.Contains(99)}"); // False
}
}
ผลลัพธ์
Dictionary:
[1] = One
[2] = Two
[3] = Three
[4] = Four
[5] = Five
[6] = Six
[7] = Seven
[8] = Eight
Keys เป็น List: 1, 2, 3, 4, 5, 6, 7, 8
Keys เป็น Array: 1, 2, 3, 4, 5, 6, 7, 8
วนลูป Keys โดยตรง:
Key: 1
Key: 2
Key: 3
Key: 4
Key: 5
Key: 6
Key: 7
Key: 8
Keys ที่เป็นเลขคู่ (เรียงมากไปน้อย):
8, 6, 4, 2
มี Key 5: True
มี Key 99: False
KeyCollection vs List vs Array
| ลักษณะ | dict.Keys (KeyCollection) | List<TKey> | TKey[] |
|---|---|---|---|
| ชนิด | KeyCollection | List | Array |
| เพิ่ม/ลบได้ | ไม่ได้ (Read-only view) | ได้ | ไม่ได้ (Fixed size) |
| Random Access | ไม่ได้ | ได้ (Indexer) | ได้ |
| LINQ | ได้ (IEnumerable) | ได้ | ได้ |
| หน่วยความจำ | ไม่กินเพิ่ม (View) | กินเพิ่ม (Copy) | กินเพิ่ม (Copy) |
| Sync กับ Dict | Real-time | Snapshot | Snapshot |
การใช้งานจริง
// 1. Export Keys ไป JSON/CSV
string keysJson = System.Text.Json.JsonSerializer.Serialize(dict.Keys);
// 2. ตรวจสอบ Key ครบตามที่ต้องการ
string[] requiredKeys = { "id", "name", "email" };
bool hasAll = requiredKeys.All(k => dict.ContainsKey(k));
// 3. สร้าง Dictionary ใหม่จาก Keys ที่กรองแล้ว
var filtered = dict.Keys
.Where(k => k > 5)
.ToDictionary(k => k, k => dict[k]);
// 4. ใช้กับ Dictionary.TryGetValue (Pattern Matching C# 11+)
foreach (var key in dict.Keys)
{
if (dict.TryGetValue(key, out var value))
{
// ใช้ value
}
}
ข้อควรระวัง
dict.Keysเป็น View - แสดงข้อมูล Real-time หาก Dictionary เปลี่ยน Keys จะเปลี่ยนตาม- หากต้องการ Snapshot (ค่าคงที่) ให้
.ToList()หรือ.ToArray() - ไม่สามารถ Add/Remove Keys ผ่าน KeyCollection ได้ - ต้องใช้ Dictionary โดยตรง
Keys.Contains(key)เทียบเท่าdict.ContainsKey(key)(O(1))- ลำดับ Keys ไม่รับประกัน (ขึ้นอยู่กับ Hash Code) - ใช้
OrderByหากต้องการเรียง