C#字典:每个密钥具有相同的值 - 我可以删除冗余吗?

Jim*_* G. 1 .net dictionary syntactic-sugar c#-3.0

请考虑以下代码,其中每个键具有相同的值:

IDictionary<string, string> quarterbackDictionary = new Dictionary<string, string>();
quarterbackDictionary.Add("Manning", "Manning");
quarterbackDictionary.Add("Brady", "Brady");
quarterbackDictionary.Add("Rivers", "Rivers");
Run Code Online (Sandbox Code Playgroud)

我的问题:

  • 我可以删除冗余,这样我就不必重复每个字符串两次,类似于以下内容:
IDictionary<string, string> quarterbackDictionary = new Dictionary<string, string>();
quarterbackDictionary.Add("Manning");
quarterbackDictionary.Add("Brady");
quarterbackDictionary.Add("Rivers");
Run Code Online (Sandbox Code Playgroud)

供参考:

  • 我正在使用字典,因为我想尝试插入重复的密钥.
  • 一个HashSet会不会扔在试图插入重复键.

dri*_*iis 11

您可以在自己的类中包装HashSet <string>,如果您尝试两次添加相同的键,则会抛出异常.

定义该类不会有太大麻烦,事实上,这是一个可以调整以满足您需求的可能实现:

    public class UniqueHashSet<T> : ICollection<T>
    {
        private readonly HashSet<T> innerSet = new HashSet<T>();

        public void Add(T item)
        {
            if (innerSet.Contains(item))
                throw new ArgumentException("Element already exists", "item");
            innerSet.Add(item);
        }

        public void Clear()
        {
            innerSet.Clear();
        }

        public bool Contains(T item)
        {
            return innerSet.Contains(item);
        }

        public void CopyTo(T[] array, int arrayIndex)
        {
            innerSet.CopyTo(array, arrayIndex);
        }

        public bool Remove(T item)
        {
            return innerSet.Remove(item);
        }

        public int Count
        {
            get { return innerSet.Count; }
        }

        public bool IsReadOnly
        {
            get { return false; }
        }

        public IEnumerator<T> GetEnumerator()
        {
            return innerSet.GetEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return innerSet.GetEnumerator();
        }
    }
Run Code Online (Sandbox Code Playgroud)

正如其他答案所提到的,您也可以将其作为扩展方法.我认为你当然可以做到这一点,除非你需要绝对确定你不能两次添加相同的项目(如果你这样做的扩展方法方式,仍然可以调用常规.Add方法).

  • 而不是使用Dictionary <>为什么不使用HashSet <>并添加一个函数,如果密钥已经存在或者将密钥添加到散列中,则抛出异常? (2认同)
  • @Aaron:正是我的想法.如果你需要抛出一个异常,使用一个(扩展?)函数,其中`if(Add == false)抛出新的异常();` (2认同)