Collection that allows only unique items in .NET?

后端 未结 7 2462
天涯浪人
天涯浪人 2020-12-13 16:35

Is there a collection in C# that will not let you add duplicate items to it? For example, with the silly class of

public class Customer {
    public string F         


        
相关标签:
7条回答
  • 2020-12-13 17:08

    Just to add my 2 cents...

    if you need a ValueExistingException-throwing HashSet<T> you can also create your collection easily:

    public class ThrowingHashSet<T> : ICollection<T>
    {
        private HashSet<T> innerHash = new HashSet<T>();
    
        public void Add(T item)
        {
            if (!innerHash.Add(item))
                throw new ValueExistingException();
        }
    
        public void Clear()
        {
            innerHash.Clear();
        }
    
        public bool Contains(T item)
        {
            return innerHash.Contains(item);
        }
    
        public void CopyTo(T[] array, int arrayIndex)
        {
            innerHash.CopyTo(array, arrayIndex);
        }
    
        public int Count
        {
            get { return innerHash.Count; }
        }
    
        public bool IsReadOnly
        {
            get { return false; }
        }
    
        public bool Remove(T item)
        {
            return innerHash.Remove(item);
        }
    
        public IEnumerator<T> GetEnumerator()
        {
            return innerHash.GetEnumerator();
        }
    
        System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
        {
            return this.GetEnumerator();
        }
    }
    

    this can be useful for example if you need it in many places...

    0 讨论(0)
  • 2020-12-13 17:16

    You may look into something kind of Unique List as follows

    public class UniqueList<T>
    {
        public List<T> List
        {
            get;
            private set;
        }
        List<T> _internalList;
    
        public static UniqueList<T> NewList
        {
            get
            {
                return new UniqueList<T>();
            }
        }
    
        private UniqueList()
        {            
            _internalList = new List<T>();
            List = new List<T>();
        }
    
        public void Add(T value)
        {
            List.Clear();
            _internalList.Add(value);
            List.AddRange(_internalList.Distinct());
            //return List;
        }
    
        public void Add(params T[] values)
        {
            List.Clear();
            _internalList.AddRange(values);
            List.AddRange(_internalList.Distinct());
           // return List;
        }
    
        public bool Has(T value)
        {
            return List.Contains(value);
        }
    }
    

    and you can use it like follows

    var uniquelist = UniqueList<string>.NewList;
    uniquelist.Add("abc","def","ghi","jkl","mno");
    uniquelist.Add("abc","jkl");
    var _myList = uniquelist.List;
    

    will only return "abc","def","ghi","jkl","mno" always even when duplicates are added to it

    0 讨论(0)
  • 2020-12-13 17:18

    If all you need is to ensure uniqueness of elements, then HashSet is what you need.

    What do you mean when you say "just a set implementation"? A set is (by definition) a collection of unique elements that doesn't save element order.

    0 讨论(0)
  • 2020-12-13 17:20

    HashSet<T> is what you're looking for. From MSDN (emphasis added):

    The HashSet<T> class provides high-performance set operations. A set is a collection that contains no duplicate elements, and whose elements are in no particular order.

    Note that the HashSet<T>.Add(T item) method returns a bool -- true if the item was added to the collection; false if the item was already present.

    0 讨论(0)
  • 2020-12-13 17:20

    How about just an extension method on HashSet?

    public static void AddOrThrow<T>(this HashSet<T> hash, T item)
    {
        if (!hash.Add(item))
            throw new ValueExistingException();
    }
    
    0 讨论(0)
  • 2020-12-13 17:24

    From the HashSet<T> page on MSDN:

    The HashSet(Of T) class provides high-performance set operations. A set is a collection that contains no duplicate elements, and whose elements are in no particular order.

    (emphasis mine)

    0 讨论(0)
提交回复
热议问题