ich es nicht sehr gerne viel ... (um klar zu sein: der Code sollte richtig funktionieren, aber ich mag es nicht). Beachten Sie, dass Delete()
jetzt eine O (n) Operation ist ... Und es könnte in eine Dispose()
konvertiert werden (plus der automatische Anruf vom Finalizer).
Einige Testcode:
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));
und die Klasse ... Beachten Sie, dass ich eine statische SortedSet<>
bin zu halten, die alle Instanzen enthält. Ich bin auch eine „Bestellung“ von MyClass
(die 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
}
Nicht sicher zu schaffen ist es eine gute Idee ... ziemlich komplex zu machen ich denke ... – xanatos
Wie kann man „eine Instanz eines löscht Klasse?" –
Jede Instanz der Klasse ist an einen treeNode in einer treeView angehängt. Der Benutzer löscht einen Knoten und löscht so die Instanz –