C#IEnumerable与迭代器

时间:2010-07-19 20:41:54

标签: c#

我尝试编写一个包含不同类型集合的学生集合的应用程序(List,ArrayList,Dictionary)

要求:

  1. 使用C#迭代器(不是FOREACH)
  2. 返回IEnumerable学生
  3. 我创建了一个名为Students的实现IEnumerable接口的类

    每个集合我有3个方法,每个方法都返回一个IEnunerable of Students

     public class Students : IEnumerable
        {
    
            //Generic List
            public IEnumerable getList()
            {
                List<string> ListStudents = new List<string>();
                ListStudents.Add("Bob");
                ListStudents.Add("Nancy");
                for (int i = 0; i < ListStudents.Count; i++)
                {
                    yield return ListStudents[i];
                }
            }
    
            //Generic Dictionary
            public IEnumerable getDiction()
            {
                Dictionary<string, string> DicStudents = new Dictionary<string, string>();
    
                DicStudents.Add("FirstName", "Nana");
    
    
                for (int i = 0; i < DicStudents.Count; i++)
                {
                    yield return DicStudents.Values.ToList()[i];
                }
            }
    
            //Array List
            public IEnumerable getArray()
            {
                ArrayList ArrayStudents = new ArrayList { "Tom", "Noah", "Peter" };
    
                for (int i = 0; i < ArrayStudents.Count; i++)
                {
                    yield return ArrayStudents[i];
                }
            }
    
            public IEnumerator GetEnumerator()
            {
    
    
            }
    
        }
    

    如何使用上面的3个集合并迭代它们,就像有一个集合一样。目前,我正在将它们放入数组中,但我似乎无法遍历它们:

       public class GetALL: IEnumerable
        {
            public IEnumerator GetEnumerator()
            {
    
                Students s = new Students();
    
                IEnumerator[] enumerator = new IEnumerator[3] 
                {
                    s.getList().GetEnumerator(),
                    s.getDiction().GetEnumerator(),
                    s.getArray().GetEnumerator(),
                };
                 return enumerator[3];
            }
        }
    

    必须有一种更简单的方式或方式,它实际上可以捐赠......

    由于

    :)


    好的,我误解了请求。

    我有以下内容:

    public class Student : IEnumerable
        {
            int ID;
            string Name;
            string Phone;
    
    
            public IEnumerable<Student> getStudentList()
            {
                List<Student> e = new List<Student>();
                e.Add(new Student() { Name = "Bob", ID = 20, Phone = "914-123-1234" });
                e.Add(new Student() { Name = "Jack", ID = 21, Phone = "718-123-1234" });
                e.Add(new Student() { Name = "Nancy", ID = 22, Phone = "212-123-1234" });
    
                for (int i = 0; i < e.Count; i++)
                {
    
                    yield return e[i];
    
                }
            }
            public IEnumerator GetEnumerator()
            {
    
            }
    
        }
    

    如何返回学生列表并将其写入控制台?我希望将学生列表保留在学生对象中,然后遍历它们并打印学生列表?

    这可能吗?

5 个答案:

答案 0 :(得分:2)

您可以在三个列表中创建三个for循环,并在每个列表中yield return

答案 1 :(得分:2)

你想要回归到底是什么?也就是说,当你说“MoveNext”时,什么类型的对象将是Current?你似乎在不同的列表中保存了不同的东西。

另外,忘了你听说过ArrayList。 ArrayList是.Net v1.1的剩余部分,当它没有泛型时。使用特定于类型的List<>会好得多。它唯一有用的地方是当你需要一个不同对象的列表时,没有共同的基类。然而,这通常是设计糟糕的表现,无论如何都可能在List<Object>中更好。

答案 2 :(得分:0)

重构您的GetALL类以按顺序调用子枚举器,这样当第一个MoveNext()返回false时,父类将移动到下一个子枚举器。在这种方法中,父类只是充当了将孩子们连接起来的metaenumerator。

答案 3 :(得分:0)

考虑一个相关的问题:

你有N个水果篮,每个水果都有一些水果。

你可以把篮子里的水果数量称为M,记住,M对于每个篮子都是不同的#n。

你能看到确实有两个级别的迭代吗?有两个变量,如X轴和Y轴。

要解决这个问题,你首先要在外部循环中,遍历篮子。然后,在循环内部,您正在使用一个固定的篮子。从那里,您可以设置一个内循环,迭代当前篮子中的各个水果。

答案 4 :(得分:0)

好的,现在你的Student课真的搞砸了。根据定义,每个学生都有一个学生名单。

这里你需要三节课:

  • 学生类 - 保留数据成员(应该是属性)并摆脱其余部分。
  • 学生班级 - 你可能想要实现IList(可能来自List

  • 一个Program类,它将包含您的Main()方法,并将为您提供Students对象,并且该方法将负责将Student对象放入Students对象。

另外,请注意List也是IEnumerable,所以你的代码是:

        List<Student> e = new List<Student>();   
        //// blah-blah-blah   
        for (int i = 0; i < e.Count; i++)   
        {   
            yield return e[i];   
        }

完全相同:

        List<Student> e = new List<Student>();   
        //// blah-blah-blah 
       return e;