迭代AREN完全可以转换为“.net方式”,但它们大致由IEnumerable < T>和IEnumerator < T>取代。
不是
vector<int> a_vector;
vector<int>::iterator a_iterator;
for(int i= 0; i < 100; i++)
{
a_vector.push_back(i);
}
int total = 0;
a_iterator = a_vector.begin();
while(a_iterator != a_vector.end()) {
total += *a_iterator;
a_iterator++;
}
你会看到(在C#)
List<int> a_list = new List<int>();
for(int i=0; i < 100; i++)
{
a_list.Add(i);
}
int total = 0;
foreach(int item in a_list)
{
total += item;
}
或者更明确(不隐藏的IEnumerator背后的foreach语法糖):
List<int> a_list = new List<int>();
for (int i = 0; i < 100; i++)
{
a_list.Add(i);
}
int total = 0;
IEnumerator<int> a_enumerator = a_list.GetEnumerator();
while (a_enumerator.MoveNext())
{
total += a_enumerator.Current;
}
由于你可以看到,foreach只是为你隐藏.net枚举器。
所以,“.net的方式”只是简单地让人们为自己创建名单< Local>项目。如果您确实想要控制迭代或使集合更加自定义,那么您的集合也要实现IEnumerable
和/或集合T>接口。
的近直接翻译为C#将是相当多的,你认为是什么:
public class Native
{
public class Local
{
public string m_str;
public int m_int;
}
private List<Local> m_Locals = new List<Local>();
public List<Local> Locals
{
get{ return m_Locals;}
}
}
然后,用户将能够
foreach(Local item in someNative.Locals)
{
...
}
这是一个好方法,但您可能还想确保至少公开Count属性:)。另外一个注意事项是,在不暴露列表或实现IEnumerable < T >的情况下,该类将不能用于.net 3.5中的LINQ扩展 – 2008-09-17 20:38:43