У меня есть класс, в котором хранится список строк, я хотел бы сделать этот класс пригодным для использования в операторе foreach, поэтому я нашел эти два интерфейса и попытался их реализовать.
public class GroupCollection : IEnumerable, IEnumerator
{
public List<string> Groups { get; set; }
public int Count { get { return Groups.Count; } }
int position = -1;
}
public IEnumerator GetEnumerator()
{
return (IEnumerator)this;
}
public object Current
{
get
{
try
{
return new Group(Groups[position]);
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
public bool MoveNext()
{
position++;
return position < Groups.Count;
}
public void Reset()
{
position = 0;
}
Я повторяю переменную GroupCollection дважды:
foreach (GroupCollection.Group in groups) // where groups is a GroupCollection
{
}
foreach (GroupCollection.Group in groups)
{
}
// where Group is a nested class in GroupCollection.
Когда он находится в первом foreach, он работает хорошо (количество в настоящее время равно 1). Я ничего не изменяю, и когда он переходит ко второму foreach, он не входит в цикл. Я просмотрел код построчно в режиме отладки и обнаружил, что reset не вызывается после первого foreach. Так должен ли я вручную вызвать reset после foreach? Разве нет более приятного способа сделать это?
Current
. Это правильное ожидание для вашего варианта использования? Как правило, вызывающие объекты ожидают, что результаты повторения коллекции дважды приведут к одним и тем же результатам. ЕслиGroup
является чем-то вроде неизменяемого типа значения, где разные экземпляры могут считаться одинаковыми, то, вероятно, это не проблема. - person Steve Mitcham   schedule 07.04.2015