web-dev-qa-db-fra.com

L'instruction Foreach C # ne contient pas de définition publique de GetEnumerator

Je rencontre un problème avec une application Windows Form que je construis en C #. L'erreur indique "l'instruction foreach ne peut pas fonctionner sur les variables de type" CarBootSale.CarBootSaleList "car" CarBootSale.CarBootSaleList "ne contient pas de définition publique pour" GetEnumerator "".

Je n'arrive pas à comprendre ce qui le cause.

C'est le code qui génère l'erreur:

        List<CarBootSaleList> Sortcarboot = new List<CarBootSaleList>();

        foreach (CarBootSale c in carBootSaleList)
        {
            if (c.Charity == "N/A")
            {
                Sortcarboot.Add(carBootSaleList);
                textReportGenerator.GenerateAllReport(Sortcarboot, AppData.CHARITY);
            }
        }

et c'est la classe CarBootSaleList où il est dit qu'il n'y a pas de définition GetEnumerator:

public class CarBootSaleList
{

    private List<CarBootSale> carbootsales;

    public CarBootSaleList()
    {
        carbootsales = new List<CarBootSale>();
    }

    public bool AddCarBootSale(CarBootSale carbootsale)
    {
        bool success = true;
        foreach (CarBootSale cbs in carbootsales)
        {
            if (cbs.ID == carbootsale.ID)
            {
                success = false;
            }
        }
        if (success)
        {
            carbootsales.Add(carbootsale);
        }
        return success;
    }

    public void DeleteCarBootSale(CarBootSale carbootsale)
    {
        carbootsales.Remove(carbootsale);
    }

    public int GetListSize()
    {
        return carbootsales.Count();
    }

    public List<CarBootSale> ReturnList()
    {
        return carbootsales;
    }

    public string Display()
    {
        string msg = "";

        foreach (CarBootSale cbs in carbootsales)
        {
            msg += String.Format("{0}  {1}", cbs.ID, cbs.Location, cbs.Date);
            msg += Environment.NewLine;
        }
        return msg;
    }
18
Danny

Votre classe CarBootSaleList n'est pas une liste. C'est une classe qui contient une liste.

Vous avez trois options:

Faites que votre objet CarBootSaleList implémente IEnumerable 

ou

faire hériter votre CarBootSaleList de List<CarBootSale>

ou 

si vous êtes paresseux, cela pourrait presque faire la même chose sans codage supplémentaire

List<List<CarBootSale>>
22
Guish

Vous ne nous montrez pas la déclaration de carBootSaleList. Cependant, à partir du message d’exception, je peux voir qu’il est de type CarBootSaleList. Ce type n'implémente pas l'interface IEnumerable et ne peut donc pas être utilisé dans un foreach.

Votre classe CarBootSaleList devrait implémenter IEnumerable<CarBootSale>:

public class CarBootSaleList : IEnumerable<CarBootSale>
{
    private List<CarBootSale> carbootsales;

    ...

    public IEnumerator<CarBootSale> GetEnumerator()
    {
        return carbootsales.GetEnumerator();
    }

    IEnumerator IEnumerable.GetEnumerator()
    {
        return carbootsales.GetEnumerator();
    }
}
13
pescolino

Dans la boucle foreach au lieu de carBootSaleList, utilisez carBootSaleList.data.

Vous n'avez probablement plus besoin de réponse, mais cela pourrait aider quelqu'un.

2
Jonhtra

Vous devez implémenter l'interface IEnumerable (CarBootSaleList devrait l'impliquer dans votre cas).

http://msdn.Microsoft.com/en-us/library/system.collections.ienumerable.getenumerator.aspx

Mais il est généralement plus facile de sous-classer System.Collections.ObjectModel.Collection et amis.

http://msdn.Microsoft.com/en-us/library/system.collections.objectmodel.aspx

Votre code semble aussi un peu étrange, comme si vous imbriquiez des listes?

0
Grubl3r