2010-07-12 17 views
238

Dado el siguiente código y las sugerencias dadas in this question, he decidido modificar este método original y preguntar si hay algún valor en el retorno de IEnumarable, si no se devuelve un IEnumerable sin valores.¿Cómo puedo devolver un IEnumerable vacío?

Aquí está el método:

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 
      }); 
     } 

Ya que todo está dentro de la instrucción de retorno, no sé cómo pude hacer esto. Algo como esto funcionaría?

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>(); 
      } 
     } 

El método anterior no funciona, y de hecho no se supone que lo haga; Siento que ilustra mis intenciones. Siento que debo especificar que el código no funciona porque no puede crear una instancia de una clase abstracta.

Aquí está el código de llamada, no quiero que le permite recibir un nulo IEnumerable en cualquier momento:

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; 
      } 

     } 

Gracias por su tiempo.

+2

Mirando el código aquí usted debe utilizar retorno rendimiento y la ruptura de rendimiento. –

Respuesta

407

Usted puede utilizar list ?? Enumerable.Empty<Friend>(), o tienen FindFriends retorno Enumerable.Empty<Friend>()

+5

¿Cambiaría las cosas si devolviese, por ejemplo, 'new List ()' ya que se convertirá en 'IEnumerable ' cuando se devuelve desde ese método? –

+60

'new List ()' es una operación más costosa porque crearía una instancia de una lista (y asignaría memoria para ello en el proceso) –

76

En cuanto a mí, más elegante forma es yield break

+5

Pero eso es si usa el retorno de rendimiento y tal, ¿no es así? – Svish

+10

+1 como su código debería usar el rendimiento por la forma en que está trabajando con IEnumerable –

+5

Disculpe mi ignorancia sobre el tema, pero podría por favor ilustrar cómo usar el límite de rendimiento en este contexto? He visto ejemplos solo en bucles for pero eso no pinta una imagen clara para mí. –

1

Creo que la forma más simple sería

return new Friend[0]; 

Los requisitos de la devolución no son más que el método devuelve un objeto que implementa IEnumerable<Friend>. El hecho de que bajo diferentes circunstancias regrese dos tipos diferentes de objetos es irrelevante, siempre y cuando ambos implementen IEnumerable.

+4

Enumerable.Empty realmente devuelve una matriz vacía de T (T [0]), con la ventaja de que se reutiliza la misma matriz vacía. Tenga en cuenta que este enfoque no es ideal para matrices no vacías, porque los elementos se pueden modificar (sin embargo, una matriz no puede redimensionarse, el cambio de tamaño implica la creación de una nueva instancia). –

7

Eso es, por supuesto, sólo una cuestión de preferencia personal, pero me gustaría escribir esta función mediante el retorno rendimiento:

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 
       } 
     } 
    } 
} 
Cuestiones relacionadas