1

次のコードについて考えてみます。各キーの値は同じです。

IDictionary<string, string> quarterbackDictionary = new Dictionary<string, string>();
quarterbackDictionary.Add("Manning", "Manning");
quarterbackDictionary.Add("Brady", "Brady");
quarterbackDictionary.Add("Rivers", "Rivers");

私の質問:

  • 次のように、冗長性を削除して、各文字列を2回繰り返す必要がないようにすることはできますか?
IDictionary<string, string> quarterbackDictionary = new Dictionary<string, string>();
quarterbackDictionary.Add("Manning");
quarterbackDictionary.Add("Brady");
quarterbackDictionary.Add("Rivers");

ご参考までに:

  • 重複するキーを挿入しようとするため、辞書を使用しています。
  • HashSetは、重複するキーを挿入しようとしてスローしません。
4

5 に答える 5

11

HashSet <string>を独自のクラスでラップし、同じキーを2回追加しようとすると、例外をスローするようにすることができます。

そのクラスを定義するのはそれほど問題ではありません。実際、ニーズに合わせて調整できる実装の可能性は次のとおりです。

    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();
        }
    }

他の回答が述べているように、それを拡張メソッドにすることもできます。同じアイテムを2回追加できないことを絶対に確認する必要がない限り、これは確実に実行できると思います(extensionメソッドの方法で実行した場合でも、通常の.Addメソッドを呼び出すことができます)。

于 2009-12-03T18:45:53.053 に答える
3

拡張メソッドをHashSetに追加します。たとえば、AddUniqueは、Addを呼び出して、戻り値がfalseの場合にスローします。

于 2009-12-03T18:54:16.747 に答える
1

System.Collections.ObjectModel.Collectionから継承し、InsertItem(保護されている)をオーバーライドします。

次に、重複チェックを実行して、誰かが重複アイテムを挿入したときにスローすることができます。InsertItemは、新しいアイテムを追加できる任意のメソッド(Add、Insertなど)で呼び出されます。

于 2009-12-03T18:48:59.943 に答える
1

おそらく、拡張メソッドを使用できます

public static class DictionaryExtensions
{
    public static void Add(this Dictionary<string, string> dictionary,  
        string keyAndValue)
    {
        string value;
        if (dictionary.TryGetValue(keyAndValue, out value))
        {
            throw new Exception();
        }

        dictionary.Add(keyAndValue, keyAndValue);
    }
}
于 2009-12-03T18:55:13.860 に答える
1

から継承することもできますSystem.Collections.ObjectModel.KeyedCollection

class MyDictionary : KeyedCollection<string, string>
{
    protected override string GetKeyForItem(string item)
    {
        return item;
    }
}

var d = new MyDictionary();
d.Add("jones");
d.Add("jones");   // this will except
于 2009-12-03T19:03:30.367 に答える