簡體   English   中英

重置對象中的自動增量計數器

[英]Reset an auto-increment counter in object

我有一class含有像這樣的自動增長計數器:

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

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

問題是,在我的應用程序中,當用戶刪除MyClass的實例時,我希望它重置計數器並為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

用戶刪除bc以便應用程序更新其余實例,因此a has a IdUnique of 1d has a IdUnique of 2

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

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

(刪除項目時,如果您了解我的意思,則將其從數組中刪除,導致其“右邊”的所有元素都向后移一。)

我不太喜歡...(要清楚:代碼應該可以正常工作,但我不喜歡它)。 請注意, 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM