Оператор C # Foreach не содержит общедоступного определения для GetEnumerator

У меня проблема с приложением Windows Form, которое я создаю на C #. Ошибка заявляет, что «оператор foreach не может работать с переменными типа CarBootSale.CarBootSaleList, потому что CarBootSale.CarBootSaleList не содержит общедоступного определения для GetEnumerator».

Кажется, я не могу понять, что вызывает это.

Это код, который вызывает ошибку:

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

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

и это класс CarBootSaleList, в котором говорится, что нет определения 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;
    }

person Danny    schedule 01.03.2013    source источник
comment
foreach (CarBootSaleList c в Sortcarboot)   -  person Phil    schedule 01.03.2013
comment
здесь вы можете найти ответ (реализация foreach): stackoverflow.com/questions/10929586/   -  person polkduran    schedule 01.03.2013
comment
Связаны ли эти две строки? Список ‹CarBootSaleList› Sortcarboot = новый Список ‹CarBootSaleList› (); foreach (CarBootSale c в carBootSaleList)   -  person bash.d    schedule 01.03.2013
comment
Где объявлена ​​carBootSaleList переменная?   -  person Marcus Vinicius    schedule 01.03.2013
comment
@Marcus Он находится на вершине класса CarBootSaleList carBootSaleList = new CarBootSaleList ();   -  person Danny    schedule 01.03.2013
comment
@ Дэнни Нет, это не так. Я прошу ПЕРЕМЕННУЮ carBootSaleList. Вы не разместили код, который это декларирует.   -  person Marcus Vinicius    schedule 01.03.2013
comment
На это уже ответил, пожалуйста, @Danny?   -  person sanepete    schedule 22.01.2018


Ответы (4)


Ваш CarBootSaleList класс не является списком. Это класс, содержащий список.

У вас есть три варианта:

Сделайте свой CarBootSaleList объект реализацией IEnumerable

or

сделайте свой CarBootSaleList унаследованным от List<CarBootSale>

or

если вы ленивы, это может почти то же самое без лишнего кодирования

List<List<CarBootSale>>
person Guish    schedule 01.03.2013
comment
Вы действительно только что предложили автору использовать List, который содержит List из CarBootSales? На самом деле имеет смысл использовать только первые два варианта. - person Security Hound; 01.03.2013

Вы не показываете нам декларацию carBootSaleList. Однако из сообщения об исключении я вижу, что это тип CarBootSaleList. Этот тип не реализует интерфейс IEnumerable и поэтому не может использоваться в foreach.

Ваш CarBootSaleList класс должен реализовывать IEnumerable<CarBootSale>:

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

    ...

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

    IEnumerator IEnumerable.GetEnumerator()
    {
        return carbootsales.GetEnumerator();
    }
}
person pescolino    schedule 01.03.2013

В foreach цикле вместо carBootSaleList используйте carBootSaleList.data.

Возможно, вам больше не нужен ответ, но он может кому-то помочь.

person Jonhtra    schedule 29.12.2014

Вы должны реализовать интерфейс IEnumerable (CarBootSaleList должен подразумевать это в вашем случае).

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

Но обычно проще создать подкласс System.Collections.ObjectModel.Collection и друзей.

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

Ваш код также кажется немного странным, как будто вы вкладываете списки?

person Grubl3r    schedule 01.03.2013