2010-07-12 28 views
238

Với mã sau và các gợi ý được đưa ra in this question, tôi đã quyết định sửa đổi phương thức gốc này và hỏi xem có bất kỳ giá trị nào trong IEnumarable trả về nó, nếu không trả về một IEnumerable không có giá trị.Làm thế nào tôi có thể trả về một IEnumerable trống?

Đây là phương pháp:

public IEnumerable<Friend> FindFriends() 
     { 
      //Many thanks to Rex-M for his help with this one. 
      //https://stackoverflow.com/users/67/rex-m 

      return doc.Descendants("user").Select(user => new Friend 
      { 
       ID = user.Element("id").Value, 
       Name = user.Element("name").Value, 
       URL = user.Element("url").Value, 
       Photo = user.Element("photo").Value 
      }); 
     } 

Kể từ khi tất cả mọi thứ ở bên trong câu lệnh return, tôi không biết làm thế nào tôi có thể làm điều này. Có công việc nào như vầy không?

public IEnumerable<Friend> FindFriends() 
     { 
      //Many thanks to Rex-M for his help with this one. 
      //https://stackoverflow.com/users/67/rex-m 
      if (userExists) 
      { 
       return doc.Descendants("user").Select(user => new Friend 
       { 
        ID = user.Element("id").Value, 
        Name = user.Element("name").Value, 
        URL = user.Element("url").Value, 
        Photo = user.Element("photo").Value 
       }); 
      } 
      else 
      { 
       return new IEnumerable<Friend>(); 
      } 
     } 

Phương pháp trên không có tác dụng và trên thực tế, phương pháp này không được giả định; Tôi chỉ cảm thấy nó minh họa ý định của tôi. Tôi cảm thấy tôi nên xác định rằng mã không hoạt động vì bạn không thể tạo một thể hiện của một lớp trừu tượng.

Đây là mã gọi điện thoại, tôi không muốn nó nhận được một null IEnumerable bất cứ lúc nào:

private void SetUserFriends(IEnumerable<Friend> list) 
     { 
      int x = 40; 
      int y = 3; 


      foreach (Friend friend in list) 
      { 
       FriendControl control = new FriendControl(); 
       control.ID = friend.ID; 
       control.URL = friend.URL; 
       control.SetID(friend.ID); 
       control.SetName(friend.Name); 
       control.SetImage(friend.Photo); 

       control.Location = new Point(x, y); 
       panel2.Controls.Add(control); 

       y = y + control.Height + 4; 
      } 

     } 

Cảm ơn bạn đã dành thời gian.

+2

Nhìn vào mã ở đây bạn nên sử dụng yield return và phá vỡ năng suất. –

Trả lời

407

Bạn có thể sử dụng list ?? Enumerable.Empty<Friend>(), hoặc có FindFriends trở Enumerable.Empty<Friend>()

+5

Liệu nó có thay đổi mọi thứ nếu anh ta trả về, 'Danh sách mới () 'vì nó sẽ được chuyển thành' IEnumerable 'khi được trả về từ phương thức đó? –

+60

'Danh sách mới ()' là một hoạt động đắt tiền hơn vì nó sẽ tạo ra một thể hiện của một danh sách (và cấp phát bộ nhớ cho nó trong quá trình) –

76

Đối với tôi, thanh lịch nhất cách là yield break

+5

Nhưng đó là nếu bạn sử dụng lợi nhuận và như vậy, phải không? – Svish

+10

+1 như mã của mình một cách chính xác nên sử dụng năng suất cho cách ông làm việc với IEnumerable –

+5

Tha thứ sự thiếu hiểu biết của tôi về chủ đề này, nhưng bạn có thể vui lòng minh họa cách sử dụng phá vỡ lợi nhuận trong bối cảnh này? Tôi đã nhìn thấy các ví dụ chỉ trong vòng lặp nhưng điều đó không vẽ một bức tranh rõ ràng cho tôi. –

1

Tôi nghĩ rằng cách đơn giản nhất sẽ là

return new Friend[0]; 

Các yêu cầu của sự trở lại là chỉ đơn thuần là phương pháp trả về một đối tượng mà thực hiện IEnumerable<Friend>. Thực tế là trong các trường hợp khác nhau, bạn trả về hai loại đối tượng khác nhau là không liên quan, miễn là cả hai thực hiện IEnumerable.

+4

Enumerable.Empty thực sự trả về một mảng trống của T (T [0]), với lợi thế là cùng một mảng trống được sử dụng lại. Lưu ý rằng cách tiếp cận này không lý tưởng cho các mảng không trống, bởi vì các phần tử có thể được sửa đổi (tuy nhiên một mảng không thể thay đổi kích thước, thay đổi kích thước liên quan đến việc tạo một thể hiện mới). –

7

Đó là tất nhiên chỉ là vấn đề sở thích cá nhân, nhưng tôi muốn viết hàm này sử dụng yield return:

public IEnumerable<Friend> FindFriends() 
{ 
    //Many thanks to Rex-M for his help with this one. 
    //http://stackoverflow.com/users/67/rex-m 
    if (userExists) 
    { 
     foreach(var user in doc.Descendants("user")) 
     { 
      yield return new Friend 
       { 
        ID = user.Element("id").Value, 
        Name = user.Element("name").Value, 
        URL = user.Element("url").Value, 
        Photo = user.Element("photo").Value 
       } 
     } 
    } 
} 
Các vấn đề liên quan