C# Foreach 语句不包含 GetEnumerator 的公共定义

Posted

技术标签:

【中文标题】C# Foreach 语句不包含 GetEnumerator 的公共定义【英文标题】:C# Foreach statement does not contain public definition for 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 的实现):***.com/questions/10929586/… 这两行有关系吗? List Sortcarboot = new List(); foreach(carBootSaleList 中的 CarBootSale c) carBootSaleList 变量声明在哪里? @Marcus 在类的顶部“CarBootSaleList carBootSaleList = new CarBootSaleList();” 【参考方案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

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

【讨论】:

以上是关于C# Foreach 语句不包含 GetEnumerator 的公共定义的主要内容,如果未能解决你的问题,请参考以下文章

C#中的foreach循环怎么用?

c#语言中,foreach循环语句,循环走到最后一层的条件怎么写?

C#中foreach用法

foreach使用方法

C# Foreach语句

C# - 带有 if 语句的 Foreach 循环