Akademi C# · Pelajaran

Carian Dictionary

Akses kunci-nilai pantas.

Pelajaran 2 daripada 413 langkah

Carian Dictionary ialah pelajaran Akademi C# percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Akademi C#, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Pasangan Kunci-Nilai

Dictionary<TKey, TValue> memetakan kunci unik kepada nilai. Anggaplah ia sebagai jadual carian: berikan kunci dan dapatkan nilainya semula dengan pantas.

Ia berasaskan jadual cincangan, jadi pencarian nilai berdasarkan kunci mengambil masa O(1) secara purata, jauh lebih pantas daripada mengimbas senarai.

using System.Collections.Generic;

var ages = new Dictionary<string, int>();
ages["Ann"] = 30;
ages["Bob"] = 25;

Memulakan Kamus

Anda boleh mengisi kamus pada awalnya menggunakan pemula koleksi. Setiap entri memasangkan kunci dengan nilainya.

Kunci mestilah unik. Membekalkan kunci yang sama dua kali dalam pemula akan mencetuskan ArgumentException semasa masa jalan.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var caps = new Dictionary<string, string> {
            ["FR"] = "Paris",
            ["JP"] = "Tokyo"
        };
        Console.WriteLine(caps["JP"]);
    }
}

Membaca Mengikut Kunci

Gunakan pengindeks untuk membaca: dict[key]. Secara purata, operasi ini ialah O(1).

Namun, berhati-hatilah: jika kunci tiada, pengindeks akan mencetuskan KeyNotFoundException. Membaca kunci yang tiada ialah salah satu pepijat kamus yang paling biasa.

var ages = new Dictionary<string, int> { ["Ann"] = 30 };
int a = ages["Ann"];      // 30
// int b = ages["Zoe"];   // throws KeyNotFoundException

Carian Selamat dengan TryGetValue

TryGetValue mengelakkan pengecualian. Ia mengembalikan true dan menetapkan pemboleh ubah out apabila kunci wujud, atau false jika sebaliknya.

Ini ialah cara lazim tanpa peruntukan memori untuk mencari nilai yang kewujudannya tidak pasti.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var ages = new Dictionary<string, int> { ["Ann"] = 30 };
        if (ages.TryGetValue("Ann", out int v))
            Console.WriteLine(v);
    }
}

ContainsKey dan Nilai Lalai

ContainsKey menyemak kewujudan kunci tanpa membaca nilainya, dalam O(1). Gunakannya sebelum membaca dengan pengindeks apabila anda hanya memerlukan jawapan ya atau tidak.

Jika anda memanggil kedua-dua ContainsKey dan pengindeks, kunci akan dicincang dua kali. TryGetValue melakukannya sekali sahaja, jadi biasanya lebih pantas.

var ages = new Dictionary<string, int> { ["Ann"] = 30 };
if (ages.ContainsKey("Ann"))
    System.Console.WriteLine(ages["Ann"]);

Menambah berbanding Menetapkan

Pengindeks dict[key] = value memasukkan pasangan baharu atau menulis ganti pasangan sedia ada. Add(key, value) hanya memasukkan pasangan dan mencetuskan pengecualian jika kunci itu sudah wujud.

Gunakan Add apabila kunci pendua patut dianggap sebagai ralat, dan gunakan pengindeks apabila penulisan ganti dibenarkan.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var d = new Dictionary<string, int>();
        d["x"] = 1;
        d["x"] = 2;     // overwrite, fine
        Console.WriteLine(d["x"]);
    }
}

Mengalih Keluar Entri

Remove(key) memadamkan pasangan dan mengembalikan true jika kunci itu wujud, dengan kerumitan purata O(1).

Satu lebihan kaedah mengembalikan nilai yang dialih keluar melalui parameter out, berguna apabila anda mahu memadamkan dan menggunakan nilai itu dalam satu langkah.

var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
bool removed = d.Remove("a");   // true
bool again = d.Remove("a");     // false

Mengulangi Pasangan

Gelung menghasilkan item KeyValuePair<TKey, TValue>. Nyahbina item tersebut kepada kunci dan nilai untuk menghasilkan kod yang kemas.

Susunan penghitungan tidak dijamin; jangan sekali-kali bergantung pada susunan entri dimasukkan. Gunakan Keys atau Values untuk mengulangi hanya satu sisi.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var d = new Dictionary<string, int> { ["a"] = 1, ["b"] = 2 };
        foreach (var (key, val) in d)
            Console.WriteLine($"{key}={val}");
    }
}

Mengira dengan Kamus

Salah satu kegunaan klasik ialah menjumlahkan bilangan kemunculan. Bagi setiap item, tingkatkan bilangannya, bermula daripada sifar jika item itu baharu.

Pola ini berjalan dalam O(n) untuk n item kerana setiap carian dan kemas kini ialah O(1), berbanding O(n kuasa dua) jika anda mengimbas senarai setiap kali.

using System;
using System.Collections.Generic;

class Program {
    static void Main() {
        var counts = new Dictionary<char, int>();
        foreach (char c in "banana")
            counts[c] = counts.GetValueOrDefault(c) + 1;
        Console.WriteLine(counts['a']);
    }
}

Kesamaan Kunci Penting

Carian bergantung pada GetHashCode dan Equals bagi jenis kunci. Jenis terbina dalam dan string berfungsi terus tanpa konfigurasi tambahan.

Bagi kunci kelas tersuai, ambil alih kedua-dua kaedah itu (atau gunakan record); jika tidak, dua kunci yang kelihatan sama akan menghasilkan cincangan yang berbeza dan carian akan gagal.

var byName = new Dictionary<string, int>(
    System.StringComparer.OrdinalIgnoreCase);
byName["Hi"] = 1;
bool found = byName.ContainsKey("HI"); // true

Memilih Jenis Nilai

Nilai boleh berupa apa-apa sahaja, termasuk senarai. Dictionary<string, List<int>> mengumpulkan banyak nilai di bawah satu kunci.

Apabila memasukkan data ke dalam struktur sedemikian, cipta senarai dalaman pada penggunaan pertama, kemudian tambah item kepadanya. Ini membina pemetaan berkumpulan dengan berbilang nilai.

var groups = new Dictionary<string, List<int>>();
void Add(string k, int v) {
    if (!groups.TryGetValue(k, out var list))
        groups[k] = list = new List<int>();
    list.Add(v);
}

Semakan Pantas

Pilih cara paling selamat untuk membaca kunci yang mungkin tiada.

Rumusan

Dictionary<K,V> menyediakan carian, pemasukan dan pengalihan keluar mengikut kunci dalam O(1) secara purata, dengan sokongan jadual cincangan.

Utamakan TryGetValue berbanding pengindeks yang mencetuskan pengecualian, pastikan kunci adalah unik, dan pastikan jenis kunci tersuai melaksanakan kesamaan serta pencincangan yang betul. Susunan pengulangan tidak ditentukan.

Percuma untuk bermula

Pelajari C# dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
93
Pelajaran
346

Soalan Lazim

Adakah pelajaran “Carian Dictionary” percuma?

Ya — teks penuh “Carian Dictionary” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Akademi C#, tingkat taraf kepada CoddyKit PRO. Kursus Akademi C# merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Carian Dictionary”?

Akses kunci-nilai pantas. Anda berlatih Akademi C# menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Akademi C#?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Akademi C# di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Carian Dictionary” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Akademi C# ini?

Ya. Setiap pelajaran Akademi C# menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. List dalam Amalan
  2. Carian Dictionary
  3. HashSet dan Keunikan
  4. Memilih Koleksi
← Kembali ke Akademi C#