Оператор С# Foreach не содержит общедоступного определения для GetEnumerator - программирование
Подтвердить что ты не робот

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

У меня возникла проблема с приложением Windows Form, которое я создаю на С#. Ошибка указывает, что "оператор 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;
    }
4b9b3361

Ответ 1

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

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

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

или

сделать наследование CarBootSaleList от List<CarBootSale>

или

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

List<List<CarBootSale>>

Ответ 2

Вы не показываете нам объявление 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();
    }
}

Ответ 3

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

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

Ответ 4

Вы должны реализовать интерфейс 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

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