Учитывая следующий код и предложения, приведенные в этом вопросе , я решил изменить этот оригинальный метод и спросить, есть ли какие-либо значения в IEnumarable, вернуть его, если не вернуть IEnumerable без значений.
Вот метод:
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
});
}
Поскольку все находится внутри оператора return, я не знаю, как я мог это сделать. Будет ли что-то вроде этой работы?
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>();
}
}
Вышеупомянутый метод не работает, и фактически это не должно; Я просто чувствую, что это иллюстрирует мои намерения. Я чувствую, что должен указать, что код не работает, потому что вы не можете создать экземпляр абстрактного класса.
Вот код вызова, я не хочу, чтобы он получал нулевой IEnumerable в любое время:
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#
ienumerable
Серхио Тапиа
источник
источник
Ответы:
Вы можете использовать
list ?? Enumerable.Empty<Friend>()
или иметьFindFriends
возвратEnumerable.Empty<Friend>()
источник
new List<Friend>()
так как он будет приведен кIEnumerable<Friend>
при возвращении из этого метода?new List<Friend>()
является более дорогой операцией, потому что она создаст экземпляр списка (и выделит для него память в процессе)Вы могли бы вернуться
Enumerable.Empty<T>()
.источник
Как по мне, самый элегантный способ
yield break
источник
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; } }
Это, конечно, только вопрос личных предпочтений, но я бы написал эту функцию, используя yield return:
источник
Я думаю, что самый простой способ был бы
Требования возврата состоят в том, что метод возвращает объект, который реализует
IEnumerable<Friend>
. Тот факт, что при разных обстоятельствах вы возвращаете два разных типа объектов, не имеет значения, поскольку оба реализуют IEnumerable.источник
источник