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

การดึงรายการ Keys จาก Dictionary ใน C#

คุณสมบัติ 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[]
ชนิดKeyCollectionListArray
เพิ่ม/ลบได้ไม่ได้ (Read-only view)ได้ไม่ได้ (Fixed size)
Random Accessไม่ได้ได้ (Indexer)ได้
LINQได้ (IEnumerable)ได้ได้
หน่วยความจำไม่กินเพิ่ม (View)กินเพิ่ม (Copy)กินเพิ่ม (Copy)
Sync กับ DictReal-timeSnapshotSnapshot

การใช้งานจริง

// 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 หากต้องการเรียง