2011-02-18 31 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