2011-02-18 9 views
0

タイトルがクリアされている場合、私は知らないが、基本的に、私はこのような何かを実装しようとしています:インスタンスの番号付けを実装する方法は?

public class Effect 
{ 
    public int InternalId ... 

    public void ResetName() ... 
} 

ResetNameが呼び出されると、これはにオブジェクトの名前をリセットします:

"Effect " + someIndex; 

だから私はEffectの5つのインスタンスを持っている場合、彼らは名前に変更されます。

"Effect 1" 
"Effect 2" 
"Effect 3" 
... 

だから私は(別の方法を持っているResetNames)を、それぞれのインスタンスに対してResetNameを呼び出す別のマネージャ/コンテナタイプに格納します。そして、今はResetNameに整数を渡さなければなりませんが、カウンタは自分自身をResetNamesの内部に保ちます。しかし、これはきれいではないと感じています。これは私がResetName自分自身をマネージャークラスの外に呼び出すのを防ぎます。これは有効です。

これを行う方法/クリーナー?

InternalIdは、すべての作成オーダーを格納するIDです。だから、番号は32000のように、大きいので、私はちょうど、これらに頼ることができない、など

EDIT:コンテナResetNamesコード:多くの可能性の

int count = 1; 
var effects = this.Effects.OrderBy (n => n.InternalId); 
foreach (Effect effect in effects) 
{ 
    effect.ResetName (count); 
    ++count; 
} 
+1

このコードはスレッドことになっている場合、それは知って役立つかもしれません安全かどうか。 –

+0

申し訳ありませんが、スレッドセーフである必要はありません。 –

+0

これを簡単に実行できるようにResetNamesを実装するコンテナからコードを追加できますか? – JohnFx

答えて

2

は命名を扱うマネージャクラスを持っています。また、子クラスの作成を処理し、自身への参照を埋め込みます。これで子クラスのResetName()を呼び出すことができます。これは、実行する必要のあるロジックをマネージャが処理するようになります。

私はあなたが結果は様々な状況になりたい正確にわからないんだけど、うまくいけば、次は、いくつかの助けになるだろう:

public class Effect { 
{ 
    private EffectManager _manager; 
    public string Name {get;set;} 

    public Effect(EffectManager manager) { 
    _manager = manager; 
    } 

    public void ResetName() { 
    Name = _manager.GetNextName(); 
    } 
} 

public class EffectManager { 
    private List<Effect> Effects; 
    private int currentIndex; 
    public Effect CreateEffect() { 
    var e = new Effect(this); 
    Effects.Add(e); 
    } 

    public string GetNextName() { 
    return "Effect " + currentIndex++; 
    } 

    public void ResetAllNames() { 
    currentIndex = 0; 
    foreach(var effect in Effects) { 
     effect.Name = GetNextName(); 
    } 
    } 
} 
0

ワン:あなたEffectクラスのパブリックプロパティを与えます名前を使用し、エフェクトオブジェクトのリストまたは配列に値を設定するメソッドで、名前を割り当てます。また、必要に応じて、ソートすることができるように、Effectクラスに整数プロパティを設定して番号を設定することもできます。

public class Effect() 
{ 
    public string Name() { get; set; } 
} 

public class SomeClass() 
{ 
    private List<Effect> Effects; 

    public static void WhateverMethod() 
    { 
    for (var i = 0; i < Effects.Count; i++) 
     Effects[i].Name = "Effect " + (i + 1).ToString(); 
    } 
} 
+0

ありがとうございますが、これはうまくいくとは思いません。すべてのエフェクトはすべてを含むグローバルコレクションに格納されるためです。だから別のリストを持つことは、より多くの簿記、同期を意味します。また、これは、単一のインスタンスのResetNameへの呼び出しには対処しません。 –

0

名前をストアドプロパティにするのではなく、次のようなことができますか?

public class Effect 
{ 
    public int InternalId ... 
    public int Index; 
    public string BaseName; 
    public string Name 
    { 
     get 
     { 
      return BaseName + index; 
     } 
    } 
} 
+0

ありがとう、私は外部の名前をリセットする必要がある場合、リセット名のロジックを外部で決定する必要がありますも、なぜあなたが0にインデックスを設定しているかわからない、これの問題だと思いますか? –

+0

0は、名前の最後に番号がないことを意味します(たとえば、末尾に数字がない「My Object」に名前全体を設定する場合など)。私はあなたが保存する必要のある名前の種類について混乱しています。この場合、ResetNameは必要ありません。 BaseNameまたはNameを直接変更することができます。 – BlueMonkMN

+0

数字は常に存在する必要があります。それ以外の場合は、数字が1からnまでのすべてのエフェクトのルールを解除します。 –

0

特定のコレクション内のすべてのインスタンスまたはすべてのインスタンスに固有の名前はありますか。

あなたのような何かを行うことができかつての場合:

public class Effect 
{ 
    private static int _lastId; 

    public Effect() 
    { 
     InternalId = _lastId++; 
    } 
    public string Name 
    { 
     get { return "Effect" + InternalId.ToString(); } 
    } 
    public int InternalId ... 
} 
+0

これは前者ですが、ユーザーが一部を削除してもう少し多くを作成するとどうなりますか?または、いくつかを削除してResetNamesを呼び出すので、すべての名前は1からnまで再開する必要がありますか? –

+0

また、別の問題は、ユーザーがファイルを保存してから再び開くと、次回はカウンタが0から始まるということです。 –

0
Namespace Diagnostics 

    <Conditional("DEBUG")> _ 
    Public NotInheritable Class UniqueID 

     Private Shared _idBase As Integer 

     Private Sub New() 
      'keep compiler from creating default constructor 
     End Sub 

     Public Shared Function GetNext() As String 
      Return "ID" + System.Threading.Interlocked.Increment(_idBase).ToString("00") 
     End Function 

    End Class 

End Namespace 
+0

ありがとうございます、これがResetNameまたはResetNamesでどのように使われるか教えてください。 –

+0

@ Joan Venge:番号/インデックス/カウンタをマネージャ/コンテナに格納する代わりに、マネージャ/コンテナに上記のように番号/インデックス/カウンタを保持するクラスを使用させます。オブジェクトはGetNextを使用できます。あなたの場合、私はリセットメソッドを追加します。 – AMissico