【问题标题】:C# Foreach statement does not contain public definition for GetEnumeratorC# Foreach 语句不包含 GetEnumerator 的公共定义
【发布时间】:2013-02-16 00:42:59
【问题描述】:

我在使用 C# 构建的 Windows 窗体应用程序时遇到问题。错误说明“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;
    }

【问题讨论】:

  • foreach(Sortcarboot 中的 CarBootSaleList c)
  • 你可以在这里找到答案(foreach 的实现):stackoverflow.com/questions/10929586/…
  • 这两行有关系吗? List Sortcarboot = new List(); foreach(carBootSaleList 中的 CarBootSale c)
  • carBootSaleList 变量声明在哪里?
  • @Marcus 在类的顶部“CarBootSaleList carBootSaleList = new CarBootSaleList();”

标签: c# definition public enumerator


【解决方案1】:

您应该实现 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

您的代码似乎也有点奇怪,就像您在嵌套列表一样?

【讨论】:

    【解决方案2】:

    您的CarBootSaleList 课程不是列表。它是一个包含列表的类。

    您有三个选择:

    让你的CarBootSaleList对象实现IEnumerable

    让您的 CarBootSaleList 继承自 List&lt;CarBootSale&gt;

    如果你很懒,这几乎可以在没有额外编码的情况下做同样的事情

    List<List<CarBootSale>>
    

    【讨论】:

    • 你真的只是建议作者使用包含ListCarBootSalesList 吗?只有前两个选项真正有意义。
    【解决方案3】:

    您没有向我们展示carBootSaleList 的声明。但是从异常消息中我可以看到它的类型为CarBootSaleList。此类型没有实现IEnumerable 接口,因此不能在foreach 中使用。

    你的CarBootSaleList 类应该实现IEnumerable&lt;CarBootSale&gt;

    public class CarBootSaleList : IEnumerable<CarBootSale>
    {
        private List<CarBootSale> carbootsales;
    
        ...
    
        public IEnumerator<CarBootSale> GetEnumerator()
        {
            return carbootsales.GetEnumerator();
        }
    
        IEnumerator IEnumerable.GetEnumerator()
        {
            return carbootsales.GetEnumerator();
        }
    }
    

    【讨论】:

      【解决方案4】:

      foreach 循环而不是carBootSaleList 中使用carBootSaleList.data

      您可能不再需要回答,但它可以帮助某人。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-05-08
        • 2014-05-20
        • 1970-01-01
        • 2023-03-16
        • 1970-01-01
        • 2014-07-10
        • 2014-04-24
        • 1970-01-01
        相关资源
        最近更新 更多