ไม่มีใครรู้ว่ามีเทียบเท่ากับSet
คอลเลกชันของ Java ใน C # หรือไม่? ฉันรู้ว่าคุณสามารถเลียนแบบชุดโดยใช้Dictionary
หรือHashTable
โดยการเติม แต่ไม่สนใจค่า แต่นั่นไม่ใช่วิธีที่สวยงามมาก
ไม่มีใครรู้ว่ามีเทียบเท่ากับSet
คอลเลกชันของ Java ใน C # หรือไม่? ฉันรู้ว่าคุณสามารถเลียนแบบชุดโดยใช้Dictionary
หรือHashTable
โดยการเติม แต่ไม่สนใจค่า แต่นั่นไม่ใช่วิธีที่สวยงามมาก
คำตอบ:
ลองHashSet :
คลาส HashSet (Of T) จัดเตรียมชุดการดำเนินการที่มีประสิทธิภาพสูง ชุดคือชุดที่ไม่มีองค์ประกอบที่ซ้ำกันและองค์ประกอบที่ไม่มีลำดับ ...
ความจุของวัตถุ HashSet (Of T) คือจำนวนองค์ประกอบที่วัตถุสามารถเก็บได้ ความจุของวัตถุ HashSet (Of T) จะเพิ่มขึ้นโดยอัตโนมัติเมื่อมีการเพิ่มองค์ประกอบเข้ากับวัตถุ
คลาส HashSet (Of T) ขึ้นอยู่กับรุ่นของชุดทางคณิตศาสตร์และให้การดำเนินการชุดที่มีประสิทธิภาพสูงคล้ายกับการเข้าถึงคีย์ของคอลเลกชันDictionary (ของ TKey, TValue)หรือHashtable กล่าวง่ายๆว่าคลาส HashSet (Of T) สามารถคิดว่าเป็นคอลเลกชันพจนานุกรม (ของ TKey, TValue)โดยไม่มีค่า
ไม่มีการเรียงลำดับคอลเลกชัน HashSet (Of T) และไม่สามารถมีองค์ประกอบที่ซ้ำกัน ...
หากคุณกำลังใช้ NET 3.5 HashSet<T>
คุณสามารถใช้ เป็นความจริงที่ .NET ไม่รองรับชุดและ Java ทำ
PowerCollections Wintellectอาจช่วยเกินไป
หากคุณใช้. NET 4.0 หรือใหม่กว่า:
SortedSet<T>
ในกรณีที่คุณจำเป็นต้องเรียงลำดับการใช้งานแล้ว มิฉะนั้นถ้าคุณทำไม่ได้แล้วใช้HashSet<T>
ตั้งแต่มันO(1)
สำหรับการค้นหาและจัดการการดำเนินงาน ในขณะที่SortedSet<T>
เป็นO(log n)
สำหรับการค้นหาและจัดการการดำเนินงาน
ฉันใช้ Iesi.Collections http://www.codeproject.com/KB/recipes/sets.aspx
มันใช้ในโครงการ OSS จำนวนมากฉันแรกพบใน NHibernate
ฉันใช้เสื้อคลุมรอบ a Dictionary<T, object>
, เก็บค่าว่างไว้ในค่า สิ่งนี้จะช่วยให้ O (1) เพิ่มค้นหาและลบคีย์และสำหรับทุกเจตนาและจุดประสงค์ทำหน้าที่เหมือนชุด
ดูPowerCollectionsที่ CodePlex นอกเหนือจาก Set and OrderedSet แล้วยังมีประเภทคอลเลกชันที่มีประโยชน์อื่น ๆ อีกมากมายเช่น Deque, MultiDictionary, กระเป๋า, OrderedBag, OrderedDictionary และ OrderedMultiDictionary
สำหรับคอลเลกชันมากขึ้นนอกจากนี้ยังมีห้องสมุดเก็บ C5 ทั่วไป
ฉันรู้ว่านี่เป็นเธรดเก่า แต่ฉันพบปัญหาเดียวกันและพบว่า HashSet ไม่น่าเชื่อถือมากเพราะได้รับเมล็ดเดียวกัน GetHashCode () ส่งคืนรหัสที่แตกต่างกัน ดังนั้นฉันคิดว่าทำไมไม่ใช้รายชื่อและซ่อนวิธีการเพิ่มเช่นนี้
public class UniqueList<T> : List<T>
{
public new void Add(T obj)
{
if(!Contains(obj))
{
base.Add(obj);
}
}
}
เนื่องจากรายการใช้วิธี Equals เพียงอย่างเดียวในการกำหนดความเท่าเทียมกันคุณสามารถกำหนดวิธี Equals ในประเภท T ของคุณเพื่อให้แน่ใจว่าคุณได้รับผลลัพธ์ที่ต้องการ
List.Contains
มีความO(n)
ซับซ้อนซึ่งหมายความว่าคุณAdd
วิธีการตอนนี้กลายเป็นO(n)
ความซับซ้อนเป็นอย่างดี การสมมติว่าคอลเล็กชันด้านในไม่จำเป็นต้องปรับขนาดAdd
ทั้งสำหรับList
และHashMap
ควรมีO(1)
ความซับซ้อน TLDR: วิธีนี้ใช้ได้ แต่มันแฮ็กและมีประสิทธิภาพน้อยกว่า