-3

我有一个继承自IEnumerable. 我需要这个类中的一个方法,它将导航到列表中的下一个项目,并相应地循环回到开头。

一些示例代码如下:

public class Enrolments : IEnumerable<IEnrolment>
{
    public IEnrolment GetNextEnrolment()
    {

    }
}

我需要以下测试才能有效

        IEnrolment enrolment1 = new Enrolment();
        IEnrolment enrolment2 = new Enrolment();

        Enrolments enrolments = new Enrolments {enrolment1, enrolment2};

        IEnrolment current;
        Assert.That(current, Is.EqualTo(enrolment1));

        current = enrolments.GetNextEnrolment();
        Assert.That(current, Is.EqualTo(enrolment2));

        current = enrolments.GetNextEnrolment();
        Assert.That(current, Is.EqualTo(enrolment1));

        current = enrolments.GetNextEnrolment();
        Assert.That(current, Is.EqualTo(enrolment2));
4

3 回答 3

0

听起来您想使用IEnumerator接口。这将起作用:

IEnrollment enrollment1 = new Enrollment();
IEnrollment enrollment2 = new Enrollment();

Enrollments enrollments = new Enrollments(enrollment1, enrollment2);
IEnumerator<IEnrollment> enumerator = enrollment.GetEnumerator();

enumerator.MoveNext();
Assert.That(enumerator.Current, Is.EqualTo(enrollment1));

enumerator.MoveNext();
Assert.That(enumerator.Current, Is.EqualTo(enrollment2));

enumerator.Reset(); // Move back to the beginning of the list

enumerator.MoveNext();
Assert.That(enumerator.Current, Is.EqualTo(enrollment1));

enumerator.MoveNext();
Assert.That(enumerator.Current, Is.EqualTo(enrollment2));
于 2013-04-23T15:38:55.910 回答
0

您可以为此使用产量

检查链接以获取说明

于 2013-04-23T15:39:20.143 回答
0

如果您有一个列表或其他索引集合作为私有字段,那么要实现此方法,您只需存储一个表示当前(或下一个)索引的整数。这样,该方法的实现就像增加索引一样简单,通过集合长度对其进行修改(以获得所需的包装行为),然后返回该索引处的项目:

public class Enrolments : IEnumerable<IEnrolment>
{
    private List<IEnrolment> list = new List<IEnrolment>();
    private int currentIndex;

    public IEnrolment GetNextEnrolment()
    {
        currentIndex = (currentIndex + 1) % list.Count;
        return list[currentIndex];
    }

    //TODO implementations of Add and GetEnumerator
}

请注意,与其拥有自己的GetNextEnrolment方法,不如拥有一个IEnumerable<IEnrolment>简单地永远持续下去、反复迭代自身的方法,而不是这种自定义方法。您可以使用一种通用方法永远重复任何序列,而不是为此专门设置它:

public static IEnumerable<T> Repeat<T>(IEnumerable<T> sequence)
{
    while (true)
    {
        foreach (var item in sequence)
            yield return item;
    }
}

使用它,因为您的序列IEnumerable<IEnrolment>已经实现,您可以这样做:

Enrollments enrollments = new Enrollments(enrollment1, enrollment2);

IEnumerable<IEnrolment> repeatingSequence = Repeat(enrollments);

这里的好处是你可以foreach超越那个重复序列(尽管break如果你这样做,你会在某些情况下想要一个,除非你打算永远去),在它上面使用 LINQ 操作,或者依赖其他基于周围的通用帮助器方法IEnumerable<T>

于 2013-04-23T16:01:49.733 回答