そのため、内部に配列を持つクラスがあります。現在、クラスのアイテムを列挙するための私の戦略は、コードを使用することですforeach (item x in classInstance.InsideArray)
. foreach (item x in classInstance)
むしろ、配列を使用してプライベートにしたいと思います。私の主な関心事は、遅いものを避ける必要があるということです。配列は頻繁にヒットします (数百の項目があります)。この配列の列挙が安価であることが重要です。1つの考えは、クラスを実装するだけIEnumerable<item>
でしInsideArray.getEnumerator()
たが、非ジェネリック列挙子しか提供しませんでした。IEnumerable
インターフェイスも実装してみました。これは機能しましたが、おそらくボクシングが原因で非常に遅くなりました。
パフォーマンスに影響を与えずにクラス自体を列挙可能にする方法はありますか?
通常コード:
//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
}
調整された、はるかに遅いコード:
//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
}
注: 非ジェネリック イテレータの実装を追加することは可能であり、私の遅いソリューションよりも高速ですが、配列を直接使用するよりも少し悪いです。どういうわけかC#に「ねえ、このオブジェクトを反復処理するように頼んだら、配列を反復処理するのと同じくらい速い」と伝える方法があることを望んでいましたが、明らかにそれは不可能です...少なくとも提案された回答からこれまで。