2013-03-01 38 views
14

Tôi gặp sự cố với ứng dụng Biểu mẫu Windows mà tôi đang xây dựng trong C#. Lỗi này cho biết "tuyên bố foreach không thể hoạt động trên các biến kiểu 'CarBootSale.CarBootSaleList' vì 'CarBootSale.CarBootSaleList' không chứa định nghĩa công khai cho 'GetEnumerator'".C# Tuyên bố Foreach không chứa định nghĩa công khai cho GetEnumerator

Tôi dường như không hiểu điều gì đang gây ra điều này.

Đây là mã được ném lên các lỗi:

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

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

và đây là lớp CarBootSaleList nơi nó nói không có một định nghĩa 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; 
    } 
+4

foreach (CarBootSaleList c trong Sortcarboot) – Phil

+0

bạn có thể tìm thấy câu trả lời ở đây (thực hiện foreach): http://stackoverflow.com/questions/10929586/what-is-the-difference-between-for-and-foreach/14812801 # 14812801 – polkduran

+0

Hai dòng này có liên quan không?Liệt kê Sortcarboot = new List (); foreach (CarBootSale c trong carBootSaleList) –

Trả lời

0

Bạn nên thực hiện Giao diện IEnumerable (CarBootSaleList nên chèn nó trong trường hợp của bạn).

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

Nhưng nó thường dễ dàng hơn để phân lớp System.Collections.ObjectModel.Collection và bạn bè

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

Mã của bạn cũng có vẻ hơi kỳ lạ, giống như bạn đang làm tổ danh sách?

19

Lớp học CarBootSaleList của bạn không phải là danh sách. Nó là một lớp có chứa một danh sách.

Bạn có ba lựa chọn:

Làm cho đối tượng CarBootSaleList của bạn thực hiện IEnumerable

hoặc

làm CarBootSaleList bạn kế thừa từ List<CarBootSale>

hoặc

nếu bạn là lười biếng này có thể gần như làm điều tương tự mà không cần mã hóa thêm

List<List<CarBootSale>> 
+6

Bạn có thực sự chỉ đề nghị tác giả sử dụng một 'Danh sách' có chứa một' Danh sách' của 'CarBootSales' không? Chỉ có hai tùy chọn đầu tiên thực sự có ý nghĩa để thực sự làm. –

+0

Bạn đá anh trai .... Điều này làm việc cho tôi –

13

Bạn không hiển thị cho chúng tôi khai báo carBootSaleList. Tuy nhiên từ thông báo ngoại lệ, tôi có thể thấy rằng nó thuộc loại CarBootSaleList. Loại này không triển khai giao diện IEnumerable và do đó không thể sử dụng trong foreach.

lớp CarBootSaleList bạn nên thực hiện IEnumerable<CarBootSale>:

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

    ... 

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

    IEnumerator IEnumerable.GetEnumerator() 
    { 
     return carbootsales.GetEnumerator(); 
    } 
} 
2

Trong vòng lặp foreach thay vì carBootSaleList sử dụng carBootSaleList.data.

Có thể bạn không cần câu trả lời nữa, nhưng nó có thể giúp ai đó.

+0

Đơn giản là tốt. – Zeek

Các vấn đề liên quan