Customer[] オブジェクトの配列があり、それを使用して Dictionary<Customer, string> を作成したいと考えています。ディクショナリをロードする前に配列の重複を調べる最も簡単な方法は何ですか? 「ArgumentException: 同じキーを持つアイテムが既に追加されています」を回避したい。ありがとう。
6 に答える
Customers を追加する前に Dictionary.ContainsKey(key) を呼び出すだけです。
LINQ を使用して両方を行うことができます。
Customer[] customers; // initialized somehow...
var customerDictionary = customers.Distinct().ToDictionary( cust => cust.SomeKey );
それほど単純ではない方法で辞書を作成する場合は、次のようにDistinct()
拡張メソッドを使用して一意の配列を取得できます。
Customer[] uniqueCustomers = customers.Distinct().ToArray();
潜在的な重複に注意する必要がある場合は、GroupBy( c => c )
最初に を使用して、重複しているアイテムを特定できます。
最後に、LINQ を使用したくない場合は、その場で辞書を作成し、各項目を追加するときに前提条件チェックを使用できます。
var customerDictionary = new Dictionary<Customer,string>();
foreach( var cust in customers )
{
if( !customerDictionary.ContainsKey(cust) )
customerDictionary.Add( cust, cust.SomeKey );
}
配列の大きさは?また、重複する可能性はどのくらいありますか?
配列の各要素を他のすべての要素に対してチェックすることは、非常にコストのかかる操作です。
Dictionary.ContainsKey(key)
各項目を追加する前に呼び出す方が速いでしょう。
注:重複がめったにない場合は、例外処理を使用できますが、それは不適切なプログラミング方法です。
パフォーマンスとコードの両方の観点から、これを行う最も効率的な方法は次のとおりです。
dict[key] = value
このようにして、あなたが言及した例外がスローされることはなく、キーの検索が2回発生することはありません
この場合の重複の定義は何ですか?
単に同じオブジェクト インスタンス (同じポインター) である場合、それは簡単です。ここに記載されている他の回答のメソッドのいずれかを使用できます。
等価の概念はそれほど単純ではありませんが、同じデータを持つ別のオブジェクト インスタンスは等しいのでしょうか? その場合、おそらく IEqualityComparer の実装が役に立ちます。
なぜこれではないのですか??
Customers.Distinct.ToDictionary(o=>o, GenerateString(o));