Dado o código a seguir e as sugestões fornecidas nesta pergunta , decidi modificar esse método original e perguntar se há algum valor no IEnumarable retorná-lo, se não retornar um IEnumerable sem valores.
Aqui está o 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 tudo está dentro da declaração de retorno, não sei como poderia fazer isso. Algo assim funcionaria?
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>();
}
}
O método acima não funciona e, de fato, não deveria; Eu apenas sinto que ilustra minhas intenções. Acho que devo especificar que o código não funciona porque você não pode criar uma instância de uma classe abstrata.
Aqui está o código de chamada, não quero que ele receba um IEnumerable nulo a qualquer 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;
}
}
Obrigado pelo seu tempo.
c#
ienumerable
Sergio Tapia
fonte
fonte
Respostas:
Você pode usar
list ?? Enumerable.Empty<Friend>()
ou terFindFriends
retornoEnumerable.Empty<Friend>()
fonte
new List<Friend>()
já que será lançadoIEnumerable<Friend>
quando retornado desse método?new List<Friend>()
é uma operação mais caro porque iria criar uma instância de uma lista (e alocar memória para ele no processo)Você poderia voltar
Enumerable.Empty<T>()
.fonte
Quanto a mim, a maneira mais elegante é
yield break
fonte
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; } }
Obviamente, isso é apenas uma questão de preferência pessoal, mas eu escreveria essa função usando yield return:
fonte
Eu acho que a maneira mais simples seria
Os requisitos do retorno são apenas que o método retorne um objeto que implementa
IEnumerable<Friend>
. O fato de que, em diferentes circunstâncias, você retorna dois tipos diferentes de objetos é irrelevante, desde que ambos implementem IEnumerable.fonte
fonte