C#中IEnumerable接口介绍并实现自定义集合

 更新时间:2022年04月18日 09:17:26   作者:農碼一生  
这篇文章介绍了C#中IEnumerable接口并实现自定义集合,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

简介

IEnumerable接口是非常的简单,只包含一个抽象的方法GetEnumerator(),它返回一个可用于循环访问集合的IEnumerator对象。对于所有数组的遍历,都来自IEnumerable接口。
IEnumerator对象有什么呢?它是一个真正的集合访问器,没有它,就不能使用foreach语句遍历集合或数组,因为只有IEnumerator对象才能访问集合中的项,假如连集合中的项都访问不了,那么进行集合的循环遍历是不可能的事情了。

一、foreach在IEnumerable中案例

    public static void Test3()
    {
        MyInt temp = new MyInt();
        foreach (int item in temp)
        Console.WriteLine(item);
    }
    //foreach的必须要实现IEnumerable和IEnumerator的接口
    public class MyInt : IEnumerable
    {
        int[] temp = { 1, 32, 43, 343 };

        public IEnumerator GetEnumerator()
        {
            return temp.GetEnumerator();
        }
    }

相当于下面代码:

    public static void Test1()
    {
        int[] myArray = { 1, 32, 43, 343 };
        //获取要遍历的枚举数
        IEnumerator myie = myArray.GetEnumerator();
        //重置当前项,相当于把指针移到初始位置:position = -1; 一开始认识数组的索引从“0”开始
        myie.Reset();
        //向前移动一个索引,返回Bool类型,判断是否超出下标
        while (myie.MoveNext())
        {
            int i = (int)myie.Current;//从Object转成对应类型
            Console.WriteLine("Value: {0}", i);
        }
    }

包含一个属性两个方法
MoveNext:把当前的项移动到下一项(类似于索引值),返回一个bool值,这个bool值用来检查当前项是否超出了枚举数的范围!
Current:获取当前项的值,返回一个object的类型!
Reset:顾名思义也就是把一些值恢复为默认值,比如把当前项恢复到默认状态值!

二、Lamda在IEnumerable中案例

//lamda表达式在数组中查询
        public static void Test2()
        {
            List<string> fruits =
              new List<string> { "apple", "passionfruit", "banana", "mango",
                    "orange", "blueberry", "grape", "strawberry" };
            //List<string> query = fruits.Where(fruit => fruit.Length < 6).ToList();
            IEnumerable<string> query = fruits.Where(fruit => fruit.Length < 6);
            foreach (string fruit in query)
                Console.WriteLine(fruit);
        }

只筛选出List中的元素长度小于6的值,然后打印出。

实现自定义集合的 IEnumerable和IEnumerator 接口

namespace ConsoleApplication1
{
    //定义Person类
    public class Person
    {
        //初始化
        public Person(string fName, string lName)
        {
            this.firstName = fName;
            this.lastName = lName;
        }

        //类成员
        public string firstName;
        public string lastName;
    }

    //实现接口
    public class People : IEnumerable
    {
        private Person[] _people;
        public People(Person[] pArray)
        {
            _people = new Person[pArray.Length];

            for (int i = 0; i < pArray.Length; i++)
            {
                _people[i] = pArray[i];
            }
        }

        IEnumerator IEnumerable.GetEnumerator()
        {
            return (IEnumerator)GetEnumerator();
        }

        //获取枚举数
        public PeopleEnum GetEnumerator()
        {
            return new PeopleEnum(_people);
        }
    }

    public class PeopleEnum : IEnumerator
    {
        public Person[] _people;

        // Enumerators are positioned before the first element
        // until the first MoveNext() call.
        int position = -1;

        public PeopleEnum(Person[] list)
        {
            _people = list;
        }

        //向下推移索引,返回Bool类型值
        public bool MoveNext()
        {
            position++;
            return (position < _people.Length);
        }

        //重置默认索引位置,默认下标为0
        public void Reset()
        {
            position = -1;
        }

        object IEnumerator.Current
        {
            get
            {
                return Current;
            }
        }

        //当前索引值
        public Person Current
        {
            get
            {
                try
                {
                    return _people[position];
                }
                catch (IndexOutOfRangeException)
                {
                    throw new InvalidOperationException();
                }
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //实例化Person
            Person[] peopleArray = new Person[3]
            {
                new Person("John", "Smith"),
                new Person("Jim", "Johnson"),
                new Person("Sue", "Rabon"),
            };

            People peopleList = new People(peopleArray);
            foreach (Person p in peopleList)
                Console.WriteLine(p.firstName + " " + p.lastName);
        }
    }
}

到此这篇关于C#中IEnumerable接口并实现自定义集合的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 浅谈C#中的Async和Await的用法详解

    浅谈C#中的Async和Await的用法详解

    这篇文章主要介绍了浅谈C#中的Async和Await的用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • C# readnodefile()不能读取带有文件名为汉字的osg文件解决方法

    C# readnodefile()不能读取带有文件名为汉字的osg文件解决方法

    这篇文章主要介绍了C# readnodefile()不能读取带有文件名为汉字的osg文件解决方法,需要的朋友可以参考下
    2015-09-09
  • C#使用selenium实现操作浏览器并且截图

    C#使用selenium实现操作浏览器并且截图

    这篇文章主要为大家详细介绍了C#如何使用selenium组件实现操作浏览器并且截图,文中的示例代码简洁易懂,有需要的小伙伴可以参考一下
    2024-01-01
  • WPF使用Dragablz构建可拖拽分离的Tab页程序

    WPF使用Dragablz构建可拖拽分离的Tab页程序

    这篇文章介绍了WPF使用Dragablz构建可拖拽分离Tab页的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 深入解析C#编程中泛型委托的使用

    深入解析C#编程中泛型委托的使用

    这篇文章主要介绍了C#编程中泛型委托的使用,引用泛型委托的代码可以指定类型参数以创建已关闭的构造类型,需要的朋友可以参考下
    2016-02-02
  • .NET Core开发之配置详解

    .NET Core开发之配置详解

    这篇文章给大家分享了.NET Core开发中相关配置的知识点内容,有需要的朋友们可以参考下。
    2018-08-08
  • 浅谈c#开发者应该了解的15个特性

    浅谈c#开发者应该了解的15个特性

    本文列举了15个值得了解的C#特性,旨在让.NET开发人员更好的使用C#语言进行开发工作。
    2021-05-05
  • 详解C#如何实现隐式类型转换

    详解C#如何实现隐式类型转换

    Result 类型是许多编程语言中处理错误的常用方式,包括 C# 的 dotNext 库。在本文中,我们将通过例子回顾 C# 中 using 语句和隐式类型转换的使用,感兴趣的可以了解一下
    2023-01-01
  • C#自定义简化cookie类实例

    C#自定义简化cookie类实例

    这篇文章主要介绍了C#自定义简化cookie类,实例分析了C#操作cookie的添加、获取及删除等操作的技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-03-03
  • 利用C#实现SSLSocket加密通讯的方法详解

    利用C#实现SSLSocket加密通讯的方法详解

    这篇文章主要给大家介绍了关于如何利用C#实现SSLSocket加密通讯的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2020-07-07

最新评论