web-dev-qa-db-ja.com

空のIEnumerableを返すにはどうすればよいですか?

以下のコードと この質問で が与えられた提案を考えると、この元のメソッドを変更し、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;
            } 

        }

お時間をいただきありがとうございます。

300
Sergio Tapia

list ?? Enumerable.Empty<Friend>()を使用するか、FindFriendsEnumerable.Empty<Friend>()を返させることができます

520
Michael Mrozek

Enumerable.Empty<T>() を返すことができます。

144
LukeH

私に関しては、最もエレガントな方法はyield breakです

91
Pavel Tupitsyn

それはもちろん個人的な好みの問題ですが、私は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
                }
        }
    }
}
8
Chaos

最も簡単な方法は

 return new Friend[0];

戻りの要件は、メソッドがIEnumerable<Friend>を実装するオブジェクトを返すことだけです。異なる状況下で2つの異なる種類のオブジェクトを返すという事実は、両方がIEnumerableを実装している限り、無関係です。

1
James Curran