Also, ich habe eine Klasse mit einem Array darin. Derzeit ist meine Strategie für die Aufzählung über die Elemente der Klasse den Code zu verwenden, foreach (item x in classInstance.InsideArray)
. Ich würde viel lieber verwenden foreach (item x in classInstance)
und das Array privat machen. Mein Hauptanliegen ist, dass ich wirklich brauchen, um etwas langsam zu vermeiden; das Array wird eine Menge (und hat ein paar hundert Elemente) getroffen. Es ist wichtig, dass die Aufzählung über dieses Array billig ist. Ein Gedanke war, einfach die Klasse zu implementieren IEnumerable<item>
aber InsideArray.getEnumerator()
gibt mir nur einen nicht-generischen Enumerator. Ich habe auch versucht, die Implementierung der IEnumerable
Schnittstelle. Diese funktionierte zwar, war aber sehr langsam, was möglicherweise auf das Boxen zurückzuführen war.
Gibt es eine Möglichkeit, die Klasse selbst ohne Leistungseinbußen aufzählbar zu machen?
Normaler Code:
//Class
public class Foo {
//Stuff
public Item[,] InsideArray {get; private set;}
}
//Iteration. Shows up all over the place
foreach (Item x in classInstance.InsideArray)
{
//doStuff
}
Angepasster, viel langsamerer Code:
//Class
public class Foo : IEnumerable {
//Stuff
private Item[,] InsideArray;
System.Collections.IEnumerator System.Collections.IEnumerable GetEnumerator()
{
return InsideArray.GetEnumerator();
}
}
//Iteration. Shows up all over the place
foreach (Item x in classInstance)
{
//doStuff
}
Hinweis: Das Hinzufügen einer Implementierung für den nicht-generischen Iterator ist möglich und schneller als meine langsame Lösung, aber es ist immer noch ein bisschen schlechter als die direkte Verwendung des Arrays. Ich hatte gehofft, es gab eine Möglichkeit, irgendwie sagen, C#, "hey, wenn ich Sie bitten, über dieses Objekt iterieren iterate über es Array, genauso schnell", aber anscheinend ist das nicht ganz möglich... zumindest von den Antworten vorgeschlagen, so weit.