Оператор С# 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;
}
Ответы
Ответ 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
Ваш код также кажется немного странным, например, списки вложенности?