2011-02-18 57 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等

編輯:集裝箱ResetNames代碼:

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

如果這個代碼應該是thread-這可能有助於瞭解安全與否。 –

+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類一個整數屬性並設置數字,以便您可以對它們進行排序,如果需要的話。

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表示名稱末尾沒有數字(例如,如果您想將整個名稱設置爲「我的對象」,例如末尾沒有數字)。我很困惑你需要存儲什麼樣的名字。在這種情況下,您不需要重設名稱。您可以直接更改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