Aracılığıyla paylaş


Nasıl yapılır: foreach ile Koleksiyon Sınıfına Erişme (C# Programlama Kılavuzu)

Aşağıdaki kod örneği ile kullanılan bir genel olmayan koleksiyon sınıfı yazmak üzere verilmektedir foreach.Bu örnek, bir dize tokenizer sınıfı tanımlar.

[!NOT]

Bu örnek, yalnızca genel toplama sınıfı kullanamadığınız önerilen yöntem temsil eder.Destekleyen bir tür-güvenli genel koleksiyonu sınıf nasıl örneği için IEnumerable, bkz: Yineleyiciler (C# ve Visual Basic).

Örnekte, aşağıdaki kod kesimi Tokens "Bu bir örnek cümle. belirtece kullanarak," cümle sonu sınıf ' ' ve '-' ayırıcıları olarak.Kod kullanarak daha sonra bu simgeleri görüntüler bir foreach ifadesi.

Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

// Display the tokens. 
foreach (string item in f)
{
    System.Console.WriteLine(item);
}

Örnek

Dahili olarak, Tokens sınıfı belirteçleri depolamak için bir dizi kullanır.Diziler uyguladığından IEnumerator ve IEnumerable, kullanılan dizinin numaralandırma yöntemleri kod örneği (GetEnumerator, MoveNext, Reset, ve Current) bunları tanımlamak yerine, Tokens sınıfı.Yöntem tanımlarını nasıl tanımlandığını ve ne açıklığa kavuşturmak için örnekte bulunan her yapar.

using System.Collections;

// Declare the Tokens class. The class implements the IEnumerable interface. 
public class Tokens : IEnumerable
{
    private string[] elements;

    Tokens(string source, char[] delimiters)
    {
        // The constructor parses the string argument into tokens.
        elements = source.Split(delimiters);
    }

    // The IEnumerable interface requires implementation of method GetEnumerator. 
    public IEnumerator GetEnumerator()
    {
        return new TokenEnumerator(this);
    }


    // Declare an inner class that implements the IEnumerator interface. 
    private class TokenEnumerator : IEnumerator
    {
        private int position = -1;
        private Tokens t;

        public TokenEnumerator(Tokens t)
        {
            this.t = t;
        }

        // The IEnumerator interface requires a MoveNext method. 
        public bool MoveNext()
        {
            if (position < t.elements.Length - 1)
            {
                position++;
                return true;
            }
            else
            {
                return false;
            }
        }

        // The IEnumerator interface requires a Reset method. 
        public void Reset()
        {
            position = -1;
        }

        // The IEnumerator interface requires a Current method. 
        public object Current
        {
            get
            {
                return t.elements[position];
            }
        }
    }


    // Test the Tokens class. 
    static void Main()
    {
        // Create a Tokens instance.
        Tokens f = new Tokens("This is a sample sentence.", new char[] {' ','-'});

        // Display the tokens. 
        foreach (string item in f)
        {
            System.Console.WriteLine(item);
        }
    }
}
/* Output:
    This
    is
    a
    sample
    sentence.  
*/

C# [NULL]'ta bir koleksiyon sınıfı uygulamak gerekli değilse IEnumerable ve IEnumerator uyumlu olması için foreach.Sınıf gerekli varsa GetEnumerator, MoveNext, Reset, ve Current üyeleri, onu çalışacağını foreach.Arabirimler atlama için dönüş türü tanımlamak etkinleştirme avantajı olan Current 'den daha fazla Object.Bu tür güvenliği sağlar.

Örneğin, önceki örnekte aşağıdaki satırları değiştirebilirsiniz.

// Change the Tokens class so that it no longer implements IEnumerable.
public class Tokens
{
    // . . .

    // Change the return type for the GetEnumerator method.
    public TokenEnumerator GetEnumerator()
    {   }

    // Change TokenEnumerator so that it no longer implements IEnumerator.
    public class TokenEnumerator
    {
        // . . .

        // Change the return type of method Current to string.
        public string Current
        {   }
    }
 }

Çünkü Current dize döndürür, derleyici tespit türü uyumsuz kullanıldığında bir foreach deyimi, aşağıdaki kodda gösterildiği gibi.

// Error: Cannot convert type string to int.
foreach (int item in f)  

Atlama dezavantajı IEnumerable ve IEnumerator koleksiyon sýnýfýný artık ile birlikte çalışabilen şudur ki foreach ifadeleri ya da diğer ortak dil çalışma zamanı dillerin eşdeğer deyim.

Ayrıca bkz.

Başvuru

Diziler (C# Programlama Kılavuzu)

System.Collections.Generic

Kavramlar

C# Programlama Kılavuzu

Diğer Kaynaklar

C# Başvurusu

Koleksiyonlar (C# ve Visual Basic)