2017-12-21 17 views
-2

私はコンポーネントのコレクションを持っています。コンポーネント名はそれぞれのコンポーネント固有のものです。ユーザーがこのコレクションに新しいコンポーネントを追加すると、既存のコンポーネントの数に応じて、コンポーネント名が1ずつ増えます。ユーザーがコンポーネントを削除すると、新しく追加されたコンポーネントに与えられたコンポーネント名は依然として一意でなければなりません。ObservableCollectionに追加するときのプロパティ名のインクリメント

今はコレクションのコンポーネントをループして、それぞれの合計量を取得し、追加するコンポーネントと等しいすべてのカウンタをインクリメントします。

private void OnComponentAdded() 
     { 
      if (SelectedComponent != null) 
      { 
       var numberOfDuplicates = 0; 
       foreach (var item in ComponentsForEquipment) 
       { 
        if (item.ComponentId == SelectedComponent.ComponentId) 
        { 
         numberOfDuplicates++; 
        } 
       } 
       numberOfDuplicates++; 
       SelectedComponent.ComponentName = SelectedComponent.ComponentType + numberOfDuplicates.ToString(); 

       var match = ComponentsForEquipment.Where(c => c.ComponentName == SelectedComponent.ComponentName).SingleOrDefault(); //componentname already exists 
       if (match == null) 
       { 
        ComponentsForEquipment.Add(SelectedComponent); 
       } 
      } 
      else 
      { 
       MessageBox.Show("Please select a component before adding.", "Message", MessageBoxButton.OK, MessageBoxImage.Information); 
      } 

     } 

ただし、ユーザーがコンポーネントを削除してからもう一度追加すると、コンポーネント名は一意ではありません。したがって、if文を追加して、コンポーネント名による一致を確認しました。問題は、ユーザーが以前に追加したコンポーネントを削除した場合、生成される新しい名前は一意ではないということです。ここで

は、コレクション内の重複したコンポーネントの例です: enter image description here

だから、3つの重複要素がコレクション内に存在する場合、第4回は1を確実にするために端部に取り付けられた「4」とコンポーネント名を持つ必要があります追加しました名前は残りの部分からユニークです。

+0

コレクションを最初にチェックしてください。ループに入ることはありません。デバッグは、カウンタが1であるためif文をチェックします。つまり、平均カウンタはforeachループ後に1回だけインクリメントされます。 – NSKBpro

+0

次のIDを表すカウンタを持ち、アイテムが追加されるたびにインクリメントするオプションですか?つまり、重複することはありません(ただし、アイテムが削除された場合は、IDに「ギャップ」が生じることがあります)。 – mjwills

答えて

0

通常、コードは機能しますが、コレクションに要素を追加し続けると、常に一方向に機能します。問題は、いくつかの要素を削除するとどうなりますか?その場合、あなたのカウンターは無益ですが、それでも彼は良いことをしています。つまり、ロジック全体を変更する必要があります。データベースで

我々は自動インクリメントIDを持っていますが、それでもあなたはID行を削除することで集約したギャップを埋めるだろうことを見ることはありません。そのカウンターはいつも真っ直ぐ進むでしょう。そのようなものを実装する必要があるか、名前の中で同じ名前とデクリメント番号を持つ思考コンポーネントを繰り返し実行するヘルパーメソッドを作成する必要があります(名前の最後の文字)。あなたはこのソリューションを見ることができるように

はあなたのソリューションをリファクタリングする多くの方法(OOP、固体とクリーンなコードの原則)ので、私の助言で良いではありません。

0

要件が互いに矛盾しているため、コードが機能しません。あなたは、新しいコンポーネントに割り当てられた名前がなければならないと述べている: 1)既存のコンポーネント 2)の何か+番号で一意であること

あなたは、あなたが持つことができないときの状況を想像するのは非常に簡単です言うように両方とも同時に。あなたの例のように、新しく追加されたコンポーネント 'ComponentName 4'(これはユニークではない)の名前を付けるか、固有の名前を付ける必要がありますが、それは既存のアイテムの量ではありません。

あなたの要件を満たすことができません。アルゴリズムが貧弱である、ID生成の戦略が間違っているなどの理由もありません。要件が一貫していないからです。ソリューションがコアにリファクタリングされていれば、それは役に立ちません。それは解決策ではなく、問題が存在する要件です。

あなたはあなたのためにそれほど重要であり、非一意の名前を許可するか、新たに追加されたコンポーネントは、すでに既存の量にちなんで命名する必要はありませんどちらかのどちらかを決定する必要があります。あるいは、おそらく、全く異なる命名戦略を思いついてみてください。

関連する問題