Java Map ที่เทียบเท่าใน C #


150

ฉันพยายามเก็บรายการไว้ในคอลเลคชั่นด้วยกุญแจที่ฉันเลือก ใน Java ฉันจะใช้ Map ดังนี้:

class Test {
  Map<Integer,String> entities;

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

มีวิธีที่เท่าเทียมกันในการทำเช่นนี้ใน C # หรือไม่? System.Collections.Generic.Hashsetไม่ใช้แฮชและฉันไม่สามารถกำหนดคีย์ประเภทที่กำหนดเอง System.Collections.Hashtableไม่ใช่คลาสทั่วไป
System.Collections.Generic.Dictionaryไม่มีget(Key)วิธีการ

คำตอบ:


181

คุณสามารถจัดทำดัชนีพจนานุกรมคุณไม่จำเป็นต้อง 'รับ'

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

วิธีที่มีประสิทธิภาพในการทดสอบ / รับค่าคือTryGetValue(thanx to Earwicker):

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

ด้วยวิธีนี้คุณจะสามารถรับค่าได้อย่างรวดเร็วและไร้ข้อยกเว้น (ถ้ามี)

แหล่งข้อมูล:

พจนานุกรมกุญแจ

ลองรับค่า


14
อาจต้องการพูดถึง TryGetValue เช่นกัน
Daniel Earwicker

มันO(lg(n))เหมือน Java หรือไม่? ฉันคิดว่าไม่

1
@Desolator Reads เป็น O (1) ดูที่ส่วนข้อสังเกตของพจนานุกรม <TKey, TValue> หน้า MSDN
canton7

17

พจนานุกรม <,> เทียบเท่า แม้ว่าจะไม่มีเมธอด Get (... ) แต่จะมีคุณสมบัติที่มีการทำดัชนีชื่อ Item ซึ่งคุณสามารถเข้าถึงได้ใน C # โดยตรงโดยใช้สัญกรณ์ดัชนี:

class Test {
  Dictionary<int,String> entities;

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

หากคุณต้องการใช้ประเภทของคีย์ที่กำหนดเองคุณควรพิจารณาใช้ IEquatable <> และแทนที่ Equals (object) และ GetHashCode () เว้นแต่ว่าค่าเริ่มต้น (การอ้างอิงหรือ struct) มีความเท่าเทียมกันในการพิจารณาความเท่าเทียมกันของคีย์ คุณควรทำให้ประเภทคีย์ของคุณไม่เปลี่ยนรูปแบบเพื่อป้องกันสิ่งแปลก ๆ ที่เกิดขึ้นหากมีการเปลี่ยนรหัสหลังจากใส่ลงในพจนานุกรม (เช่นเนื่องจากการกลายพันธุ์ทำให้รหัสแฮชเปลี่ยน)


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;
    }
}

5
คำตอบนี้เก่ามาก แต่คุณสามารถคืนค่าได้โดยไม่คำนึงถึงผลลัพธ์TryGetValueเนื่องจากvalจะได้รับมอบหมายnull(เช่นdefault(string)) หากไม่มีคีย์
dlev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.