Bagaimana cara mendapatkan daftar kunci dalam Kamus?

152

Saya hanya ingin Kunci dan bukan Nilai Kamus.

Saya belum bisa mendapatkan kode untuk melakukan ini. Menggunakan array lain terbukti terlalu banyak bekerja karena saya menggunakan hapus juga.

Bagaimana cara saya mendapatkan Daftar Kunci dalam Kamus?

Athiwat Chunlakhan
sumber

Jawaban:

305
List<string> keyList = new List<string>(this.yourDictionary.Keys);
Camal
sumber
6
apakah perlu menggunakan "ini."
JerryGoyal
15
@ JerryGoyal Tidak, tidak perlu. Ini hanya digunakan untuk menghapus kebingungan tentang apakah yourDictionarymerupakan bagian dari objek, diturunkan dalam fungsi atau nama parameter.
bcdan
1
Jawaban yang lebih lengkap adalah dengan tidak menganggap tipe kunci sebagai string. var keyList = yourDictionary.Keys.ToList (); Atau jika Anda ingin menjadi gila dan tidak menggunakan var atau Linq: - Ketikkan keyType = yourDictionary.GetType (). GetGenericArguments () [0]; Ketik listType = typeof (Daftar <>). MakeGenericType (keyType); IList keyList = (IList) Activator.CreateInstance (listType); keyList.AddRange (yourDictionary.Keys);
Antony Booth
70

Anda harus dapat melihat .Keys:

    Dictionary<string, int> data = new Dictionary<string, int>();
    data.Add("abc", 123);
    data.Add("def", 456);
    foreach (string key in data.Keys)
    {
        Console.WriteLine(key);
    }
Marc Gravell
sumber
2
Dan bagaimana jika Anda menghapus kunci di loop?
Martin Capodici
5
@MartinCapodici maka Anda biasanya harus mengharapkan iterator untuk istirahat dan menolak untuk melanjutkan
Marc Gravell
5
Marc, ya jadi dalam hal ini Anda akan melakukan sesuatu seperti jawaban yang lain dan membuat daftar baru.
Martin Capodici
43

Untuk mendapatkan daftar semua kunci

using System.Linq;
List<String> myKeys = myDict.Keys.ToList();

System.Linq didukung dalam .Net framework 3.5 atau lebih tinggi. Lihat tautan di bawah ini jika Anda menghadapi masalah dalam menggunakan System.Linq

Visual Studio Tidak mengenali System.Linq

System.Linq Namespace

prem
sumber
13
Tolong jangan lupa: using System.Linq;Saya perlu tahu jawaban mana yang harus diabaikan. Maaf :)
Bitterblue
2
@Bitterblue terima kasih. Saya tidak mengerti mengapa .ToList()saya membuat kesalahan ketika saya telah menggunakannya berkali-kali, jadi saya datang ke sini untuk mencari jawaban dan saya menyadari file yang saya kerjakan tidak ada using System.Linq:)
Drew
1
tidak bekerja:Dictionary<string, object>.KeyCollection' does not contain a definition for 'ToList'
sakra
memang tidak berhasil. gunakan jawaban yang diterima sebagai gantinya.
aleck
1
@aleck Ini berfungsi dengan baik. Anda mungkin tidak menggunakan System.Linq seperti yang disarankan oleh Bitterblue atau versi .Net framework yang Anda gunakan tidak mendukungnya. Itu diperkenalkan di .Net framework 3.5, Lihat tautan ini . Saya memperbarui jawaban untuk menggunakan System.Linq sebelum menggunakan metode ini.
prem
12

Jawaban Marc Gravell seharusnya bekerja untuk Anda. myDictionary.Keysmengembalikan objek yang mengimplementasikan ICollection<TKey>, IEnumerable<TKey>dan mitra non-generiknya.

Saya hanya ingin menambahkan bahwa jika Anda berencana mengakses nilainya juga, Anda dapat melihat-lihat kamus seperti ini (contoh yang dimodifikasi):

Dictionary<string, int> data = new Dictionary<string, int>();
data.Add("abc", 123);
data.Add("def", 456);

foreach (KeyValuePair<string, int> item in data)
{
    Console.WriteLine(item.Key + ": " + item.Value);
}
Thorarin
sumber
3

Pertanyaannya agak sulit untuk dipahami, tetapi saya menduga masalahnya adalah Anda mencoba untuk menghapus elemen dari Kamus saat Anda beralih ke tombol. Saya pikir dalam hal ini Anda tidak punya pilihan selain menggunakan array kedua.

ArrayList lList = new ArrayList(lDict.Keys);
foreach (object lKey in lList)
{
  if (<your condition here>)
  {
    lDict.Remove(lKey);
  }
}

Jika Anda dapat menggunakan daftar umum dan kamus alih-alih ArrayList maka saya akan melakukannya, namun yang di atas seharusnya hanya berfungsi.

Dan
sumber
2

Saya tidak percaya semua jawaban yang berbelit-belit ini. Dengan asumsi kuncinya adalah type: string (atau gunakan 'var' jika Anda seorang pengembang yang malas): -

List<string> listOfKeys = theCollection.Keys.ToList();
Antony Booth
sumber
Apa maksudmu itu tidak berhasil? Kamus memiliki properti kunci yang bertipe KeyCollection, yang mengimplementasikan ICollection yang memiliki metode ekstensi ToList <> (). Tambahkan System.Linq ke pernyataan 'menggunakan' Anda dan Anda harus baik. using System.linq;
Antony Booth
0

Atau seperti ini:

List< KeyValuePair< string, int > > theList =
    new List< KeyValuePair< string,int > >(this.yourDictionary);

for ( int i = 0; i < theList.Count; i++)
{ 
  // the key
  Console.WriteLine(theList[i].Key);
}
sth
sumber
apakah ini membuat salinan kunci? (agar Anda dapat menyebutkan dengan aman)
mcmillab
Itu menulis ulang ekstensi .ToList <T> () linq. Juga, Daftar KeyValuePair adalah Kamus. Permintaan asli hanya untuk daftar Kunci. Menggunakan loop untuk mengisi tidak perlu karena Daftar memiliki konstruktor yang mengambil koleksi dan juga memiliki metode AddRange () untuk menambahkan ke Daftar yang ada. Lihat jawaban yang diterima.
Antony Booth
0

Untuk kamus hybrid, saya menggunakan ini:

List<string> keys = new List<string>(dictionary.Count);
keys.AddRange(dictionary.Keys.Cast<string>());
Kosma
sumber
-2

Saya sering menggunakan ini untuk mendapatkan kunci dan nilai di dalam kamus: (VB.Net)

 For Each kv As KeyValuePair(Of String, Integer) In layerList

 Next

(layerList bertipe Kamus (Of String, Integer))

Joseph Wu
sumber