unity的C#学习——foreach循环相关:IEnumerable接口、LINQ语言集成查询、可枚举对象与枚举类型

C#里的判断和循环

C#和C语言都有条件语句和循环语句,但是它们在某些方面有所不同:

  • 条件语句方面,C#和C语言都支持if语句和switch语句。但是,C#引入了新的语言特性,如is 运算符空条件运算符(?.)空合并运算符(??)等,可以简化某些常见的条件检查。

  • 循环语句方面,C#和C语言都支持while、do-while和for循环。但是,C#引入了新的语言特性,如foreach语句yield关键字,可以简化对集合和枚举类型的循环操作。

  • 另外,C#还引入了LINQ(Language Integrated Query)语言集成查询,可以更方便地查询和操作集合数据。

因此,虽然C#和C语言都有相似的条件语句和循环语句,但是它们的语言特性有所不同,需要根据具体的语言和应用场景来选择合适的语法结构。

1、foreach循环

C#中的foreach循环提供了一种简单的迭代访问数组、集合和其他可枚举对象中的元素的方法。foreach循环通常比使用传统的for循环更简洁、易读,并且避免了许多由于编写错误的索引计算而导致的问题。

下面是使用foreach循环遍历数组的示例:

int[] numbers = {
    
     1, 2, 3, 4, 5 };
foreach (int number in numbers)
{
    
    
    Console.WriteLine(number);
}

上述代码中,foreach循环将每个整数元素赋值给变量number,并在循环体中使用该变量。可以看到,与传统的for循环相比,foreach循环不需要显式计算数组索引。

除了数组,foreach循环也可以用于遍历其他集合类型,例如List、Dictionary和Queue。只要集合实现了IEnumerable接口,就可以在foreach循环中使用它。下面是使用foreach循环遍历List集合的示例:

扫描二维码关注公众号,回复: 14594191 查看本文章
List<string> names = new List<string>() {
    
     "Alice", "Bob", "Charlie" };
foreach (string name in names)
{
    
    
    Console.WriteLine(name);
}

总之,C#中的foreach循环是一种方便的迭代访问可枚举对象的方法,可以简化代码并减少索引计算错误。

2、IEnumerable接口

IEnumerable接口是C#中的一个基础接口,用于表示一个可枚举的集合。该接口定义了一个GetEnumerator()方法,用于返回一个IEnumerator对象,该对象可以用于枚举集合中的元素。

IEnumerable接口是所有可枚举集合类型的基础接口,包括数组、列表、队列、栈等等。通过实现IEnumerable接口,可以让自定义的集合类型能够像内置的集合类型一样被枚举。

下面是一个示例代码,演示了如何自定义一个集合类型,并实现IEnumerable接口:

using System;
using System.Collections;

class CustomCollection : IEnumerable
{
    
    
    private int[] numbers;

    public CustomCollection(int[] numbers)
    {
    
    
        this.numbers = numbers;
    }

    public IEnumerator GetEnumerator()
    {
    
    
        return new CustomEnumerator(numbers);
    }

    private class CustomEnumerator : IEnumerator
    {
    
    
        private int[] numbers;
        private int index = -1;

        public CustomEnumerator(int[] numbers)
        {
    
    
            this.numbers = numbers;
        }

        public bool MoveNext()
        {
    
    
            index++;
            return index < numbers.Length;
        }

        public void Reset()
        {
    
    
            index = -1;
        }

        public object Current
        {
    
    
            get {
    
     return numbers[index]; }
        }
    }
}

class Program
{
    
    
    static void Main()
    {
    
    
        int[] numbers = {
    
     1, 2, 3, 4, 5 };
        CustomCollection collection = new CustomCollection(numbers);

        foreach (int n in collection)
        {
    
    
            Console.WriteLine(n);
        }
    }
}

在上述代码中,我们定义了一个CustomCollection类,该类实现了IEnumerable接口,并且实现了GetEnumerator()方法,返回一个自定义的CustomEnumerator对象。CustomEnumerator类实现了IEnumerator接口,用于实现枚举集合中元素的逻辑。

在Main()方法中,我们创建了一个int数组,然后将其作为参数传递给CustomCollection类的构造函数,创建了一个自定义的集合对象。最后,我们使用foreach循环遍历该集合对象中的元素,并将其输出到控制台中。

  • 在C#中,foreach语句就是使用in关键字来遍历集合元素的语法糖。当我们在foreach语句中使用一个集合类型时,C#编译器会自动检测该类型是否实现了IEnumerable接口,如果实现了,则编译器会自动调用GetEnumerator()方法获取一个IEnumerator对象,然后使用该对象遍历集合中的元素。

运行上述代码,输出结果为:

1
2
3
4
5

3、LINQ语言集成查询

LINQ(Language Integrated Query)是C#中的一个重要特性,它允许开发人员使用一种统一的语法来查询各种数据源,包括集合、数组、数据库等等。LINQ将查询语句集成到C#语言中,使得查询变得更加直观、简洁和可维护。

LINQ使用一种类似于SQL的查询语法,但是它不仅仅适用于关系型数据库,而且适用于各种数据源。在LINQ中,数据源被表示为一个实现了IEnumerable或IQueryable接口的对象。通过使用LINQ语法,可以从这些数据源中选择、过滤、排序和组合数据。

下面是一个示例代码,演示了如何使用LINQ查询一个整数数组中的所有偶数:

using System;
using System.Linq;

class Program
{
    
    
    static void Main()
    {
    
    
        int[] numbers = {
    
     1, 2, 3, 4, 5 };

        var evenNumbers = from n in numbers //LINQ查询语法,返回一个可枚举集合对象
                          where n % 2 == 0
                          select n;

        foreach (int n in evenNumbers)
        {
    
    
            Console.WriteLine(n);
        }
    }
}

在上述代码中,我们使用LINQ查询语法来查询一个整数数组中的所有偶数。from关键字指定了数据源,where关键字指定了筛选条件,select关键字指定了要选择的数据。在查询结果中,我们使用foreach循环遍历所有偶数,并将其输出到控制台中。

运行上述代码,输出结果为:

2
4

可以看到,使用LINQ可以方便地从数据源中查询所需的数据,并使用C#的语法进行处理和输出。同时,LINQ还支持更多的查询操作,例如排序、分组和聚合等操作(详见SQL语句)。

4、可枚举对象和枚举类型的区别

在C#中,枚举类型是一种特殊的值类型,用于定义一组命名的常量。枚举类型的值是预定义的、具名的常量,也称为枚举成员。枚举类型通过将这些值组合在一起来表示可能的选项。

可枚举对象是指任何实现IEnumerable接口的类型。该接口定义了一个GetEnumerator方法,该方法返回一个IEnumerator接口的实例。IEnumerator接口定义了用于遍历集合中元素的方法。

  • 枚举类型本身不是可枚举对象,但是可以通过实现IEnumerable接口来使枚举类型成为可枚举对象。通过实现该接口,可以在枚举类型上使用foreach语句,以遍历其成员。

以下是一个枚举类型变为可枚举对象的示例,其中的枚举成员表示不同的颜色:

enum Color
{
    
    
    Red,
    Green,
    Blue
}

如果想要在该枚举类型上使用foreach语句,可以通过以下方式实现IEnumerable接口:

enum Color : byte, IEnumerable
{
    
    
    Red,
    Green,
    Blue

    public IEnumerator GetEnumerator() //自定义的GetEnumerator()方法,在遍历时需要调用
    {
    
    
        return Enum.GetValues(typeof(Color)).GetEnumerator();
    }
}

现在,可以在该枚举类型上使用foreach语句,以遍历其成员:

foreach (Color color in new Color())
{
    
    
    Console.WriteLine(color);
}

在上面的示例中,涉及了以下两个函数:

  1. Enum.GetValues(Type enumType):返回枚举类型的所有成员的数组。该方法接受一个参数,即表示枚举类型的Type对象,并返回一个包含该枚举类型所有成员的数组。
  • 在示例中,Enum.GetValues(typeof(Color)) 返回了一个数组,包含了枚举类型Color中所有成员。
  1. IEnumerator GetEnumerator():返回一个IEnumerator接口的实例,该实例包含了遍历集合中的元素的方法。该方法必须在实现IEnumerable接口的类或结构中定义。
  • 在示例中,我们定义的GetEnumerator() 方法内部调用了Enum.GetValues(typeof(Color)).GetEnumerator() 方法,相当于继承了数组的GetEnumerator()方法,获取一个IEnumerator接口实例,包含了用于foreach循环遍历的实例方法。

输出结果为:

Red
Green
Blue

注意,枚举类型必须实现IEnumerable接口才能成为可枚举对象,否则无法在其上使用foreach语句。

猜你喜欢

转载自blog.csdn.net/qq_50571974/article/details/129721971