Peta Java setara dengan C #

150

Saya mencoba memegang daftar item dalam koleksi dengan kunci pilihan saya. Di Jawa, saya cukup menggunakan Peta sebagai berikut:

class Test {
  Map<Integer,String> entities;

  public String getEntity(Integer code) {
    return this.entities.get(code);
  }
}

Apakah ada cara yang setara untuk melakukan ini di C #? System.Collections.Generic.Hashsettidak menggunakan hash dan saya tidak bisa mendefinisikan kunci tipe kustom System.Collections.Hashtablebukan kelas generik
System.Collections.Generic.Dictionarytidak memiliki get(Key)metode

zmbq
sumber

Jawaban:

181

Anda dapat mengindeks Kamus, Anda tidak perlu 'mendapatkan'.

Dictionary<string,string> example = new Dictionary<string,string>();
...
example.Add("hello","world");
...
Console.Writeline(example["hello"]);

Cara yang efisien untuk menguji / mendapatkan nilai adalah TryGetValue(thanx ke Earwicker):

if (otherExample.TryGetValue("key", out value))
{
    otherExample["key"] = value + 1;
}

Dengan metode ini, Anda dapat berpuasa dan tanpa pengecualian mendapatkan nilai (jika ada).

Sumber:

Kamus-Kunci

Coba Dapatkan Nilai

boj
sumber
14
Mungkin ingin menyebutkan TryGetValue juga.
Daniel Earwicker
Apakah itu O(lg(n))seperti Java? Saya pikir tidak
1
@Desolator Reads adalah O (1), lihat bagian Keterangan dari halaman Kamus <TKey, TValue> MSDN
canton7
17

Kamus <,> adalah padanannya. Meskipun tidak memiliki metode Get (...), ia memiliki properti yang diindeks bernama Item yang dapat Anda akses di C # secara langsung menggunakan notasi indeks:

class Test {
  Dictionary<int,String> entities;

  public String getEntity(int code) {
    return this.entities[code];
  }
}

Jika Anda ingin menggunakan jenis kunci khusus maka Anda harus mempertimbangkan untuk mengimplementasikan IEquatable <> dan mengesampingkan Persamaan (objek) dan GetHashCode () kecuali jika kesetaraan default (referensi atau struct) cukup untuk menentukan kesetaraan kunci. Anda juga harus membuat tipe kunci Anda tidak dapat diubah untuk mencegah hal-hal aneh terjadi jika kunci dimutasi setelah dimasukkan ke dalam kamus (misalnya karena mutasi menyebabkan kode hash-nya berubah).

Dave
sumber
10
class Test
{
    Dictionary<int, string> entities;

    public string GetEntity(int code)
    {
        // java's get method returns null when the key has no mapping
        // so we'll do the same

        string val;
        if (entities.TryGetValue(code, out val))
            return val;
        else
            return null;
    }
}
LukeH
sumber
5
Jawaban ini sudah sangat tua, tetapi Anda bisa mengembalikan nilai terlepas dari hasilnya TryGetValue, karena valakan diberikan null(yaitu default(string)) jika kunci tidak ada.
dlev