Maison  >  Article  >  développement back-end  >  Explication détaillée d'exemples de foreach et de rendement en C#

Explication détaillée d'exemples de foreach et de rendement en C#

黄舟
黄舟original
2017-10-05 15:31:262003parcourir

1. foreach

Le compilateur C# convertira l'instruction foreach en méthodes et propriétés de l'interface IEnumerable.


foreach (Person p in persons)
 {
     Console.WriteLine(p);
 }

L'instruction foreach sera analysée dans le segment de code suivant.

Appelez la méthode GetEnumerator() pour obtenir une énumération du tableau

Dans la boucle while, tant que MoveNext() renvoie true, la boucle continuera

Utilisez l'attribut Current pour accéder aux éléments du tableau


IEnumerator enumerator = persons. GetEnumerator(); while (enumerator.MoveNext())
 {
    Person p = (Person) enumerator.Current;
    Console.WriteLine(p);
}

2. déclaration de rendement

Deux formes de déclaration de rendement :


yield return <expression>;yield break;

Utilisez une instruction rendement return pour renvoyer un élément de la collection

La méthode ou la propriété contenant l'instruction rendement est un itérateur. Les itérateurs doivent répondre aux exigences suivantes

a. Le type de retour doit être IEnumerable, IEnumerable8742468051c85b06f0a0af9e3e506b5c, IEnumerator ou IEnumerator8742468051c85b06f0a0af9e3e506b5c.

b. Il ne peut pas avoir de paramètres ref ou out

L'instruction rendement return ne peut pas être dans un bloc try-catch. L'instruction Yield Return peut être située dans le bloc try-finally try


try
              {                  // ERROR: Cannot yield a value in the boday of a try block with a catch clause
                 yield return "test";
              }             catch
             { } 
              try
             {                 // 
                 yield return "test again";
             }             finally
             { } 
             try
             { }             finally
             { 
                 // ERROR: Cannot yield in the body of a finally clause
                yield return ""; 
             }

L'instruction Yield Break peut être située dans le bloc try ou catch, mais ne peut pas être situé dans le bloc final

Les exemples suivants sont du code qui utilise l'instruction rendement return pour implémenter une collection simple et utilise l'instruction foreach pour itérer la collection


using System;using System.Collections.Generic;namespace ConsoleApplication6
{    class Program
    {        static void Main(string[] args)
        {
            HelloCollection helloCollection = new HelloCollection();            foreach (string s in helloCollection)
            {
                Console.WriteLine(s);
                Console.ReadLine();
            }
        }
    }    public class HelloCollection
    {        
        public IEnumerator<String> GetEnumerator()
        {            // yield return语句返回集合的一个元素,并移动到下一个元素上;yield break可以停止迭代
            yield return "Hello";            yield return "World";
        }
    }
}

Utilisez l'instruction rendement-retour pour parcourir la collection de différentes manières. Classe :


using System;using System.Collections.Generic;namespace ConsoleApplication8
{    class Program
    {        static void Main(string[] args)
        {
            MusicTitles titles = new MusicTitles();            foreach (string title in titles)
            {
                Console.WriteLine(title);
            }
            Console.WriteLine();            foreach (string title in titles.Reverse())
            {
                Console.WriteLine(title);
            }
            Console.WriteLine();            foreach (string title in titles.Subset(2, 2))
            {
                Console.WriteLine(title);
                Console.ReadLine();
            }
        }
    }    public class MusicTitles
    {        string[] names = { "a", "b", "c", "d" };        public IEnumerator<string> GetEnumerator()
        {            for (int i = 0; i < 4; i++)
            {                yield return names[i];
            }
        }        public IEnumerable<string> Reverse()
        {            for (int i = 3; i >= 0; i--)
            {                yield return names[i];
            }
        }        public IEnumerable<string> Subset(int index, int length)
        {            for (int i = index; i < index + length; i++)
            {                yield return names[i];
            }
        }
    }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn