2009-08-14 7 views
16

重複するコレクションアイテムを追加しないようにするには、次のコードで例外をスローする必要があります。重複するアイテムをコレクションに追加しようとすると、どの例外タイプをスローする必要がありますか?

ICollection<T> collection = new List<T>(); 

public void Add(T item) 
{ 
    if (collection.Contain(item)) 
    { 
      throw new SomeExceptoinType() 
    } 

    collection.Add(item); 
} 

最も標準的な例外タイプは何ですか?

+1

データベースの[DuplicateNameException](https://msdn.microsoft.com/en-us/library/system.data.duplicatenameexception(v = vs.110).aspx)が見つかりました。 'Collection'のためのちょっとしたアイデアです。 Take home message:より具​​体的にしたい人は誰でも自分のException_ – KCD

答えて

22

まあ、Dictionary<,>.Add()ArgumentExceptionをスローしますので、私はこれが先例可能性が推測(辞書にもその例外を使用しています)、適切な例外になります。

2

私はInvalidOperationExceptionを使用します。

メソッド呼び出しが オブジェクトの現在の状態に対して無効な場合にスローされる例外を。

引数の値の妥当性は、オブジェクトの状態次第であるので、(それが本当であるかどうかをcollection.Contains(item)である)私は、これは使用するのに最適な例外だと思います。

例外に発信者にとって何が問題であったかを明確にする良いメッセージを追加してください。

+1

IMHOに感染する可能性があります。InvalidOperationExceptionは、大抵の場合、不適切な順序付けシーケンスを示すために混乱します。例えば、閉じたリーダーなどから読む。 – klashar

4

ArgumentExceptionが最適でしょう。これは、引数が無効な場合にスローされる例外です。

2

ArgumentExceptionが、そのようなキーが既に存在する場合

1
System.ArgumentException 
-1

私がArgumentExceptionがスローになり、コレクション

+0

もしそれが辞書であれば、これは真実だが、そうではない。 – Brandon

+0

重複を許可しないコレクションや、それらを許可する辞書があります。ポスターのケースでは、重複は望ましくありません。なぜ、例外をスローしたいのですか? –

+0

申し訳ありませんが、私はそのコメントをひどく言いました。私は、OPが重複を許可するコレクションを使用していて、実際には無効な操作ではないと言っていました。その "彼はこの有効な"ものを考慮していない。また、私はこれを落とした人ではありません> _>私はこれが最良の例外だとは思わないが、それを使うのは間違っているとは思わない。 – Brandon

1

ですでにだオブジェクトを追加することは有効ではありませんので、私は、InvalidOperationExceptionを言うと思います。これはSystem.Collections.Generic.SortedList<>がそのAddメソッドで行うことです。 .NET Framework 2.0のコードから

public void Add(TKey key, TValue value) 
    { 
     if (key == null) 
     { 
      System.ThrowHelper.ThrowArgumentNullException(System.ExceptionArgument.key); 
     } 
     int num = Array.BinarySearch<TKey>(this.keys, 0, this._size, key, this.comparer); 
     if (num >= 0) 
     { 
      System.ThrowHelper.ThrowArgumentException(System.ExceptionResource.Argument_AddingDuplicate); 
     } 
     this.Insert(~num, key, value); 
    } 
2

LINQのは、あなたがsystem.dataアセンブリを使用している場合は、これらを使用することができ、さらに2つの例外を除いDuplicateNameExceptionはDuplicateKeyExceptionを使用しています。

関連する問題