以下のコードと この質問で が与えられた提案を考えると、この元のメソッドを変更し、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>();
}
}
上記の方法は機能せず、実際には機能しません。それが私の意図を示していると感じています。 抽象クラスのインスタンスを作成できないため、コードが機能しないことを指定する必要があると思います。
呼び出しコードは次のとおりです。いつでもnull 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;
}
}
お時間をいただきありがとうございます。
list ?? Enumerable.Empty<Friend>()
を使用するか、FindFriends
にEnumerable.Empty<Friend>()
を返させることができます
Enumerable.Empty<T>()
を返すことができます。
私に関しては、最もエレガントな方法は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
}
}
}
}
最も簡単な方法は
return new Friend[0];
戻りの要件は、メソッドがIEnumerable<Friend>
を実装するオブジェクトを返すことだけです。異なる状況下で2つの異なる種類のオブジェクトを返すという事実は、両方がIEnumerableを実装している限り、無関係です。