C# 中的 IEnumerable

作者 : 慕源网 本文共4359个字,预计阅读时间需要11分钟 发布时间: 2021-10-31 共490人阅读

背景

很多时候需要遍历匿名类型的类或列表的集合。IEnumerable 接口是循环遍历集合的 C# 语言的最佳特性之一。让我们一步一步地了解它,以便初学者也能理解。

什么是 C# 中的 IEnumerable?

C# 中的 IEnumerable 是一个接口,它定义了一个方法 GetEnumerator,它返回一个 IEnumerator 接口。这允许对集合进行只读访问,然后实现 IEnumerable 的集合可以与 for-each 语句一起使用。

关键点

  1. IEnumerable 接口包含 System.Collections.Generic 命名空间。
  2. IEnumerable 接口是一个通用接口,它允许循环通用或非通用列表。
  3. IEnumerable 接口也适用于 linq 查询表达式。
  4. IEnumerable 接口返回一个遍历集合的枚举器。

让我们在一个类中实现 IEnumerable 接口:

public class Customer : IEnumerable
{
    public IEnumerator GetEnumerator()
    {
        throw new NotImplementedException();
    }
}

在上面的示例中,您已经看到,在实现 IEnumerable 接口之后,有一个名为 GetEnumerator 的方法以及接口 IEnumerator,它有助于从集合中获取当前元素。

IEnumerator 接口的方法

IEnumerator 是一个帮助从集合中获取当前元素的接口,它有以下两种方法

  1. MoveNext()
  2. Reset()

MoveNext()

将枚举器设置为集合的下一个元素;如果枚举数已成功设置为下一个元素,则返回 true,如果枚举数已到达集合的末尾,则返回 false。

Reset()

将枚举数设置为其初始位置,该位置位于集合中的第一个元素之前。

IEnumerator 接口的属性

IEnumerator 接口有一个名为 Current 的属性,它返回集合中的当前元素。

让我们在类中实现 IEnumerator 接口:

public class Customer : IEnumerator
{
    public object Current
    {
       get { throw new NotImplementedException(); }
    }

    public bool MoveNext()
    {
       throw new NotImplementedException();
    }

    public void Reset()
    {
       throw new NotImplementedException();
    }
}

在上面的类中,我们已经实现了 IEnumerator 接口,它显示了我们已经解释过的上述两种方法和一个属性。

IEnumerable 与 IEnumerator 接口

在阅读这两个名称时,可能会令人困惑,因此让我们了解这两个名称之间的区别。

  1. IEnumerable 和 IEnumerator 都是接口。
  2. IEnumerable 只有一种称为 GetEnumerator 的方法。此方法返回另一种类型,即接口为 IEnumerator 的接口。
  3. 如果我们想在任何集合类中实现枚举器逻辑,就需要实现 IEnumerable 接口(泛型或非泛型)。
  4. IEnumerable 只有一种方法,而 IEnumerator 有两种方法(MoveNext 和 Reset)和一个属性 Current。

对于我们的理解,我们可以说 IEnumebale 是一个包含 IEnumerator 的盒子。

让我们通过创建一个简单的应用程序来实际学习它。

现在将项目创建为:

  1. “开始”-“所有程序”-“Microsoft Visual Studio 2010”。
  2. “文件”-“新项目”-“C#”-“空项目”(避免添加母版页)。
  3. 根据需要提供项目名称,例如 “IEnumerableInterface”或其他名称,并指定位置。
  4. 然后右键单击解决方案资源管理器并选择“添加新项目”,然后选择 Default.aspx 页面。
  5. 添加一个按钮。

现在 Default.aspx 源代码如下:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="IEnumerableInterface.Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">

    <asp:Button ID="Button1" runat="server" Text="GetList" OnClick="Button1_Click" />
    </form>
</body>
</html>

现在打开 Default.aspx.cs 类文件并创建名为 Customer 的类,其属性为:

public class Customer
{
    private String _Name, _City;
    private long _Mobile;
    private double _Amount;

    public String Name
    {
        get { return _Name; }
        set { _Name = value; }
    }
    public String City
    {
        get { return _City; }
        set { _City = value; }
    }

    public long Mobile
    {
        get { return _Mobile; }
        set { _Mobile = value; }
     }

    public double Amount
    {
        get { return _Amount; }
        set { _Amount = value; }
    }
}

在上面的类文件中,我们创建了 string、long 和 double 类型的属性,稍后我们将与 IEnumerable 通用接口一起使用。现在创建客户类类型的数组并将值分配给每个属性:

Customer[] customers = new Customer[]
{
    new Customer {Name="Vithal Wadje",City="Mumbai",Mobile=99999999999,Amount=89.45 },
    new Customer { Name = "Sudhir Wadje", City = "Latur", Mobile = 88888888888888888888, Amount =426.00 },
    new Customer { Name = "Anil", City = "Delhi", Mobile = 77777777777777777777, Amount = 5896.20 }
};

现在在上面,客户类型数组具有不同类型的值,我们已分配给我们创建的属性,现在让我们使用 IEnumerable 接口循环遍历上述集合:

public IEnumerable<Customer> GetAllCustomer()
{
    return customers;
}

在上面的例子中,我已经将 Customer 类集合分配给 IEnumerable 来循环遍历每个元素,现在我们已经解释了 IEnumerable 接口集合可以借助 IEnumerable 接口集合的 foreach 循环进行迭代,现在让我们遍历每个项目使用 IEnumerable 接口作为

foreach (var cust in GetAllCustomer())
{
    Response.Write("Name: "+cust.Name + "
    <br> " +"City: " +cust.City + " <br> " +"Mobile "+cust.Mobile+"<br>
    "+"Amount :" +cust.Amount.ToString("c") + "<br>"+"-----"+"<br>");
}
using System;
using System.Collections.Generic;

namespace IEnumerableInterface
{
    public partial class Default : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            foreach (var cust in GetAllCustomer())
            {
              Response.Write("Name: "+cust.Name + "<br> " +"City: " +cust.City + " <br> "
                        +"Mobile "+cust.Mobile+"<br> "+"Amount :" +cust.Amount.ToString("c") + "<br>"+"-----"+"<br>");
            }
        }
        public class Customer
        {
            private String _Name, _City;
            private long _Mobile;
            private double _Amount;

            public String Name
            {
                get { return _Name; }
                set { _Name = value; }
            }
            public String City
            {
                get { return _City; }
                set { _City = value; }
            }

            public long Mobile
            {
                get { return _Mobile; }
                set { _Mobile = value; }
            }
            public double Amount
            {
                get { return _Amount; }
                set { _Amount = value; }
            }
        }
        Customer[] customers = new Customer[]
        {

            new Customer {Name="Vithal Wadje",City="Mumbai",Mobile=99999999999,Amount=89.45 },
            new Customer { Name = "Sudhir Wadje", City = "Latur", Mobile = 88888888888888888888, Amount =426.00 },
            new Customer { Name = "Anil", City = "Delhi", Mobile = 77777777777777777777, Amount = 5896.20 }
        };

        public IEnumerable<Customer> GetAllCustomer()
        {
            return customers;
        }
    }
}

现在运行应用程序并单击 GetList 按钮,输出如下:

C# 中的 IEnumerable

现在从上面的例子中,很明显我们可以使用 IEnumerable 接口遍历泛型和非泛型集合。

概括

我希望这篇文章对所有读者有用,如果您有任何建议,请联系我


慕源网 » C# 中的 IEnumerable

常见问题FAQ

程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!

发表评论

开通VIP 享更多特权,建议使用QQ登录