Dado el siguiente código y las sugerencias dadas en esta pregunta , he decidido modificar este método original y preguntar si hay algún valor en el IEnumarable, devolverlo, si no devolver un IEnumerable sin valores.
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
});
}
Como todo está dentro de la declaración de devolución, no sé cómo podría 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; Solo siento que ilustra mis intenciones. Creo que debería especificar que el código no funciona porque no se puede crear una instancia de una clase abstracta.
Aquí está el código de llamada, no quiero que reciba un IEnumerable nulo en ningún 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 tu tiempo.
c#
ienumerable
Sergio Tapia
fuente
fuente
Respuestas:
Puedes usar
list ?? Enumerable.Empty<Friend>()
, o tenerFindFriends
devoluciónEnumerable.Empty<Friend>()
fuente
new List<Friend>()
ya que será lanzadoIEnumerable<Friend>
cuando regrese de ese método?new List<Friend>()
es una operación más costosa porque crearía una instancia de una lista (y asignaría memoria para ello en el proceso)Podrías volver
Enumerable.Empty<T>()
.fuente
En cuanto a mí, la forma más elegante es
yield break
fuente
public IEnumerable<Friend> FindFriends() { if(!userExists) yield break; foreach(var descendant in 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 })) { yield return descendant; } }
Por supuesto, eso es solo una cuestión de preferencia personal, pero escribiría esta función usando return return:
fuente
Creo que la forma más sencilla sería
Los requisitos de la devolución son simplemente que el método devuelve un objeto que implementa
IEnumerable<Friend>
. El hecho de que, en diferentes circunstancias, devuelva dos tipos diferentes de objetos es irrelevante, siempre que ambos implementen IEnumerable.fuente
fuente