2017-02-16 38 views
0

的自動增長計數器我有一個包含這樣一個自動遞增計數器class重置的對象

class MyClass 
{ 
    private static object sync = new object(); 
    private static int globalCount; 
    private int idUnique; 

    public MyClass() 
    { 
     lock(sync) 
     { 
      idUnique = ++globalCount; 
     } 
    } 
} 

的問題是,在我的應用程序,當用戶刪除MyClass的實例,我d喜歡它重置計數器並重新計算MyClass的其餘實例的計數器。

例如:

MyClass a has IdUnique of 1 
MyClass b has IdUnique of 2 
MyClass c has IdUnique of 3 
MyClass d has IdUnique of 4 

用戶刪除b & c所以該應用更新剩餘實例,因此a has a IdUnique of 1d has a IdUnique of 2和。

+0

不知道這是個好主意......相當複雜,使我覺得... – xanatos

+0

一個人如何「刪除的一個實例類?」 –

+0

該類的每個實例都附加到treeView中的treeNode。用戶刪除一個節點,從而刪除實例 –

回答

1

我不喜歡很很多...(要清楚:代碼應該正常工作,但我不喜歡它)。請注意,Delete()現在是一個O(n)操作...並且它可以在Dispose()(加上來自終結器的自動調用)中轉換。

一些測試代碼:

var insts = new[] { new MyClass(), new MyClass(), new MyClass(), new MyClass() }; 
Console.WriteLine(string.Join(", ", (object[])insts)); 
insts[1].Delete(); 
Console.WriteLine(string.Join(", ", (object[])insts)); 
insts[3].Delete(); 
Console.WriteLine(string.Join(", ", (object[])insts)); 
insts[0].Delete(); 
Console.WriteLine(string.Join(", ", (object[])insts)); 
insts[2].Delete(); 
Console.WriteLine(string.Join(", ", (object[])insts)); 

和類...請注意,我保持一個包含所有實例的靜態SortedSet<>。我甚至創建的MyClass「排序」(在IComparable<MyClass>

class MyClass : IComparable<MyClass> { 
    public static SortedSet<MyClass> Instances = new SortedSet<MyClass>(); 
    private static object sync = new object(); 
    private int idUnique; 
    private int originalIdUnique; 

    public MyClass() { 
     lock (sync) { 
      idUnique = Instances.Count > 0 ? Instances.Max.idUnique + 1 : 1; 
      originalIdUnique = idUnique; 
      Instances.Add(this); 
     } 
    } 

    // It could be a Dispose()! 
    public void Delete() { 
     if (idUnique == int.MinValue) { 
      return; 
     } 

     lock (sync) { 
      Instances.Remove(this); 

      if (Instances.Count > 0 && this.idUnique < Instances.Max.idUnique) { 
       var instances = Instances.GetViewBetween(this, Instances.Max); 

       foreach (var instance in instances) { 
        instance.idUnique--; 
       } 
      } 

      idUnique = int.MinValue; 
     } 
    } 

    public override string ToString() { 
     return string.Format("Id: {0} (OriginalId: {1})", idUnique, originalIdUnique); 
    } 

    #region IComparable<MyClass> Members 

    public int CompareTo(MyClass other) { 
     return idUnique.CompareTo(other.idUnique); 
    } 

    #endregion 
} 
+0

非常感謝您的回答@xanatos,它的效果很好。我仍然會對整體應用程序代碼進行一些改進,以使其更「可愛」 –

3

這樣的事情更多的是對象的集合比其他任何東西更屬性。

如果要將對象實例組織爲數組類型的結構,那麼可以將該對象在該數組中的位置用作唯一標識符。

(當刪除一個項目,你從數組導致所有元素爲「右」的是由一個移回,如果你明白我的意思將其刪除。)

+0

因此,就我而言,因爲所有實例都附加到樹形視圖中的節點,我創建了所有這些節點的集合並根據集合中的位置添加Id。 –