Учитывая следующий код и предложения, данные в этом вопросе, я решил изменить этот исходный метод и спросить, существуют ли какие-либо значения в возврате IEnumarable он, если не возвращают IEnumerable без значений.
Вот метод:
public IEnumerable 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
});
}
Так как все в операторе возврата, я не знаю, как я мог сделать это. Что-то вроде этого работало бы?
public IEnumerable 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();
}
}
Вышеупомянутый метод не работает, и на самом деле он, как не предполагается; я просто чувствую, что это иллюстрирует мои намерения. Я чувствую, что должен указать, что код не работает, потому что Вы не можете создать экземпляр абстрактного класса.
Вот код вызова, я не хочу, чтобы он получил пустой IEnumerable в любое время:
private void SetUserFriends(IEnumerable 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;
}
}
Спасибо за Ваше время.
Вы можете использовать список ?? Enumerable.Empty
или FindFriends
return Enumerable.Empty
Думаю, что проще всего будет
return new Friend[0];
Требования к return сводятся к тому, чтобы метод возвращал объект, реализующий IEnumerable
. Тот факт, что при разных обстоятельствах вы возвращаете два разных типа объектов, не имеет значения, пока оба реализуют IEnumerable.
На мой взгляд, самый элегантный способ - это yield break
Это, конечно, вопрос личных предпочтений, но я бы написал эту функцию с использованием 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
}
}
}
}