ในการตอบคำถามก่อนอื่นเราต้องดูจุดประสงค์ของพจนานุกรมและเทคโนโลยีพื้นฐาน
Dictionary
คือรายชื่อของ KeyValuePair<Tkey, Tvalue>
ที่แต่ละค่าแสดงด้วยคีย์เฉพาะของมัน สมมติว่าเรามีรายการอาหารโปรดของคุณ แต่ละค่า (ชื่ออาหาร) แสดงด้วยคีย์เฉพาะ (ตำแหน่ง = คุณชอบอาหารนี้มากแค่ไหน)
รหัสตัวอย่าง:
Dictionary<int, string> myDietFavorites = new Dictionary<int, string>()
{
{ 1, "Burger"},
{ 2, "Fries"},
{ 3, "Donuts"}
};
สมมติว่าคุณต้องการที่จะมีสุขภาพที่ดีคุณเปลี่ยนใจและต้องการแทนที่ "เบอร์เกอร์" ที่คุณชื่นชอบด้วยสลัด รายการของคุณยังคงเป็นรายการโปรดของคุณคุณจะไม่เปลี่ยนลักษณะของรายการ รายการโปรดของคุณจะยังคงเป็นอันดับหนึ่งในรายการมีเพียงมูลค่าเท่านั้นที่จะเปลี่ยนไป นี่คือเมื่อคุณเรียกสิ่งนี้ว่า:
/*your key stays 1, you only replace the value assigned to this key
you alter existing record in your dictionary*/
myDietFavorites[1] = "Salad";
แต่อย่าลืมว่าคุณเป็นโปรแกรมเมอร์และจากนี้ไปคุณจะจบประโยคด้วย คุณปฏิเสธที่จะใช้อิโมจิเพราะจะทำให้เกิดข้อผิดพลาดในการคอมไพล์และรายการโปรดทั้งหมดเป็น 0 ดัชนี
การกินของคุณก็เปลี่ยนไปเช่นกัน! ดังนั้นคุณจึงแก้ไขรายการของคุณอีกครั้ง:
/*you don't want to replace Salad, you want to add this new fancy 0
position to your list. It wasn't there before so you can either define it*/
myDietFavorites[0] = "Pizza";
/*or Add it*/
myDietFavorites.Add(0, "Pizza");
มีความเป็นไปได้สองประการในการกำหนดคุณอาจต้องการให้คำจำกัดความใหม่สำหรับสิ่งที่ไม่มีมาก่อนหรือคุณต้องการเปลี่ยนคำจำกัดความที่มีอยู่แล้ว
วิธีการเพิ่มช่วยให้คุณสามารถเพิ่มระเบียนได้ แต่ต้องอยู่ภายใต้เงื่อนไขเดียวเท่านั้น: คีย์สำหรับคำจำกัดความนี้อาจไม่มีอยู่ในพจนานุกรมของคุณ
ตอนนี้เราจะดูภายใต้ประทุน เมื่อคุณสร้างพจนานุกรมคอมไพเลอร์ของคุณทำการจองที่เก็บข้อมูล (ช่องว่างในหน่วยความจำเพื่อจัดเก็บบันทึกของคุณ) ที่เก็บข้อมูลไม่ได้จัดเก็บคีย์ตามวิธีที่คุณกำหนด แต่ละคีย์จะถูกแฮชก่อนที่จะไปที่ที่เก็บข้อมูล (กำหนดโดย Microsoft) ซึ่งควรค่าแก่การกล่าวถึงส่วนของค่านั้นจะไม่เปลี่ยนแปลง
ฉันจะใช้อัลกอริทึมการแฮช CRC32 เพื่อทำให้ตัวอย่างของฉันง่ายขึ้น เมื่อคุณกำหนด:
myDietFavorites[0] = "Pizza";
สิ่งที่จะไปในถังคือdb2dc565 "Pizza" (แบบง่าย)
เมื่อคุณแก้ไขค่าด้วย:
myDietFavorites[0] = "Spaghetti";
คุณแฮช 0 ของคุณซึ่งเป็นdb2dc565อีกครั้งจากนั้นคุณค้นหาค่านี้ในที่เก็บข้อมูลเพื่อดูว่ามีอยู่หรือไม่ หากมีคุณเพียงแค่เขียนค่าที่กำหนดให้กับคีย์ใหม่ หากไม่มีคุณจะใส่มูลค่าของคุณลงในถัง
เมื่อคุณเรียกใช้ฟังก์ชันเพิ่มในพจนานุกรมของคุณเช่น:
myDietFavorite.Add(0, "Chocolate");
คุณแฮช 0 เพื่อเปรียบเทียบค่ากับค่าในที่เก็บข้อมูล คุณอาจจะวางไว้ในถังแต่ถ้ามันไม่ได้มี
สิ่งสำคัญคือต้องรู้ว่ามันทำงานอย่างไรโดยเฉพาะอย่างยิ่งถ้าคุณทำงานกับพจนานุกรมของสตริงหรือคีย์ประเภทถ่าน เป็นกรณีที่ละเอียดอ่อนเนื่องจากอยู่ระหว่างการแฮช ตัวอย่างเช่น "name"! = "Name" ลองใช้ CRC32 เพื่ออธิบายสิ่งนี้
ค่าสำหรับ "name" คือ: e04112b1
ค่าสำหรับ "ชื่อ" คือ1107fb5b