ทำไมจึงไม่มีการติดตั้ง OrderedDictionary ทั่วไปใน. net


26

เหตุใด Microsoft จึงไม่ให้การใช้พจนานุกรมแบบสั่งโดยทั่วไป?

มีการใช้งานที่กำหนดเองไม่กี่ฉันได้เห็นรวมถึง: http://www.codeproject.com/KB/recipes/GenericOrderedDictionary.aspx

แต่ทำไม Microsoft ถึงไม่รวมอยู่ในไลบรารี. net พื้นฐาน แน่นอนว่าพวกเขามีเหตุผลที่จะไม่สร้าง .... แต่มันคืออะไร?

ก่อนที่จะโพสต์ข้อความนี้ฉันได้เห็น: https://stackoverflow.com/questions/2629027/no-generic-implementation-of-ordereddictionary

แต่นั่นเป็นการยืนยันว่ามันไม่มีอยู่จริง ไม่ใช่เหตุผลที่ไม่มีอยู่จริง

ขอบคุณ


2
มีเสมอSortedDictionary<TKey, TValue>: msdn.microsoft.com/en-us/library/f7fta44c.aspx
Travis Gockel

2
นอกจากว่าฉันเข้าใจเอกสาร SortedDict ผิดนั่นไม่ใช่สิ่งที่ฉันต้องการ ฉันไม่ต้องการให้การเรียงลำดับเสร็จสิ้น ฉันแค่ต้องการอาร์เรย์ที่ฉันสามารถเข้าถึงได้โดยใช้คีย์ อย่างไรก็ตามฉันสงสัยว่าทำไม MS ถึงข้ามสิ่งนี้ (ปัญหาที่ละเอียดอ่อน ฯลฯ )
nonot1

กรณีการใช้งานทั่วไปสำหรับพจนานุกรมที่สั่งซื้อคืออะไร ฉันดิ้นรนที่จะคิดออกจากหัวของฉัน
Carson63000

1
@Carson ทุกครั้งที่คุณมีรายการข้อมูลมากมายที่คุณต้องการเข้าถึงแบบสุ่มอย่างรวดเร็ว ในการจัดเก็บใน Dict เพียงแค่สูญเสียข้อมูลการสั่งซื้อและการใช้อาร์เรย์คุณจะต้องดูแลรักษาดัชนีของคุณเอง
nonot1

2
ขอให้ Eric Lippert อ่านและตอบคำถามของคุณ เขามักจะเห็นด้วยที่จะช่วยเหลือคำถามประเภทนี้ ฉันคิดว่าคุณสามารถติดต่อเขาผ่านบล็อกของเขา: blogs.msdn.com/b/ericlippert
devuxer

คำตอบ:


17

ในC # 4.0 สั้นฉันอ่านสิ่งนี้:

  1. OrderedDictionaryคือการรวมกันของHashTableและArrayList
  2. ไม่มีทั่วไป ArrayList
  3. " ArrayListคลาสnongeneric ใช้เป็นหลักสำหรับความเข้ากันได้แบบย้อนหลังกับ Framework 1.x ... "
  4. "มีความArrayListคล้ายคลึงกับหน้าที่List<object>"
  5. "การสะท้อนนั้นง่ายกว่าด้วย nongeneric ArrayListมากกว่าList<object>"

สรุป?

ไม่มีทั่วไปOrderedDictionaryเพราะมันสร้างพื้นฐานเป็นชั้น (ไม่เป็นทางการ) เสื่อมราคาที่ไม่มีรุ่นทั่วไปเอง


4
นี่ไม่ได้ตอบคำถามจริงๆ OrderedDictionary ทั่วไปสามารถสร้างได้จากพจนานุกรมทั่วไปและรายการทั่วไป
JacquesB

ศีลหนึ่งของการใช้คลาสคือถ้า UI ไม่เปลี่ยนใครสนใจเกี่ยวกับการใช้งานหรือไม่ ดีทีมออกแบบภาษา / เรียบเรียงสมมติว่าอาจต้องการทั่วไปสืบทอดคู่ไม่ใช่ทั่วไปของ ความรู้สึกของฉันกระเด้ง สำหรับผู้เริ่มต้น: บรรพบุรุษที่แตกต่างกัน (ทันที) เป็นเหมืองที่ดินที่ไหนสักแห่งในเส้นทางวิวัฒนาการสำหรับ OrderedDictionaryความแปรปรวนร่วมและความแปรปรวนตรงกันข้ามหรือไม่?
Radarbob

15

OrderedDictionaryoverloads การดำเนินงานการจัดทำดัชนีเพื่อให้การจัดทำดัชนีที่มีจำนวนเต็มNจะได้รับรายการในตำแหน่งNในขณะที่การจัดทำดัชนีที่มีObjectจะดึงรายการ coresponding ไปยังวัตถุที่ หากมีการสร้างรายการที่ถูกOrderedDictionary<int, string>เรียกmyDictและเพิ่ม (1, "George") และ (0, "Fred") ตามลำดับควรmyDict[0]ส่งคืน "George" หรือ "Fred" หรือไม่

ปัญหาดังกล่าวอาจได้รับการแก้ไขโดยกำหนดข้อ จำกัด ของประเภทคีย์ ในทางกลับกันประโยชน์ส่วนใหญ่ของคอลเลกชันทั่วไปเกิดจากความสามารถในการทำงานกับประเภทของค่าได้อย่างมีประสิทธิภาพ การกำหนดข้อ จำกัด ของคลาสในประเภทคีย์นั้นดูน่าเกลียดเล็กน้อย

หากคลาสนั้นไม่จำเป็นต้องเป็นไปตาม CLS แต่เพียงต้องทำงานกับ vb.net การออกแบบที่สมเหตุสมผลอาจต้องใช้คุณสมบัติของดัชนีที่มีชื่อ ดังนั้นในตัวอย่างข้างต้นmyDict.ByKey[0]จะได้ผล "เฟร็ด" และmyDict.BySequence[0]จะให้ผล "จอร์จ" น่าเสียดายที่ภาษาอย่าง C # ไม่รองรับคุณสมบัติที่จัดทำดัชนีไว้ ในขณะที่ใครคนหนึ่งอาจมีบางอย่างที่ทำให้การใช้ไวยากรณ์ข้างต้นแม้จะไม่มีคุณสมบัติเช่นนี้ แต่การตัดสินใจที่โชคร้ายที่ห่อหุ้มโครงสร้างของสิ่งที่ชอบPointและRectangleหมายความว่าสำหรับmyDict.ByKey[0] = "Wally"การทำงานmyDict.ByKeyจะต้องส่งคืนคลาสวัตถุใหม่ struct จะมีประสิทธิภาพมากขึ้น แต่คอมไพเลอร์จะปฏิเสธสิ่งที่ดูเหมือนว่าเขียนไปยังโครงสร้างแบบอ่านอย่างเดียว (แม้ว่าจะมีคุณสมบัติที่จะไม่แก้ไข struct ที่ส่งกลับโดยByKeyแต่ให้ปรับเปลี่ยนคอลเล็กชันที่อ้างอิงไว้)

โดยส่วนตัวฉันคิดว่าวัตถุพจนานุกรม - ish ที่ระบุไว้ในการติดตามคำสั่งการแทรกจะเป็นสิ่งที่ดีที่จะมี; ฉันต้องการที่จะมีวัตถุ dictionary-ish ซึ่งสามารถคืนค่าคีย์ที่เชื่อมโยงกับคีย์เฉพาะได้อย่างง่ายดาย (เช่นถ้ามีพจนานุกรมตัวพิมพ์เล็กและตัวพิมพ์ใหญ่และเพิ่มบันทึกด้วยคีย์ "GEORGE" สามารถถามพจนานุกรมว่าคีย์ใดเกี่ยวข้องกับ "จอร์จ" โดยไม่ต้องค้นหาKeyValuePairวัตถุทั้งหมดที่ส่งคืนด้วยการแจงนับ


3

เนื่องจากการรักษาลำดับไว้จะป้องกันการค้นหา O (1) ที่ IDictionary หมายถึงนอกเสียจากคุณจะใส่สองคอลเล็กชัน (หนึ่งสำหรับการสั่งซื้อหนึ่งรายการสำหรับการค้นหา) ซึ่งทำให้การเพิ่ม / ลบประสิทธิภาพลดลงและเพิ่มการใช้หน่วยความจำ หรือคุณอาจค้นหาการแลกเปลี่ยนช้าลงเพื่อลดการใช้หน่วยความจำ

ฉันเดาว่าไม่มีตัวเลือก 'ชัดเจนดีกว่า' ที่นี่ดังนั้นจึงไม่เข้าไปในห้องสมุดมาตรฐาน โดยเฉพาะประมาณ 2.0 C # ยังคงเรียนรู้จากความผิดพลาดของ Java ฉันจะไม่แปลกใจถ้า Java 'ทุกอย่างและอ่างล้างจาน' เข้าใกล้คอลเล็กชั่นในห้องสมุดมาตรฐานของพวกเขาก็ถูกมองว่าเป็นสิ่งที่ควรหลีกเลี่ยงเช่นกัน


1
มีช้ามองขึ้นในการแลกเปลี่ยนสำหรับหน่วยความจำน้อยเพียงได้อย่างมีประสิทธิภาพทำให้ ฉันคิดว่าทุกคนที่มีกรณีการใช้งานที่ถูกกฎหมายสำหรับการใช้มันโดยเฉพาะเพราะพวกเขาต้องการชั้นเรียนคอลเลกชันที่มีการค้นหา O (1) แต่ยังจำลำดับการแทรกซึ่งในกรณีนี้ใช้หน่วยความจำเพิ่มเติมไม่สามารถหลีกเลี่ยงได้ OrderedDictionaryListOrderedDictionary
Abion47
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.