1. ホーム
  2. c#

[解決済み] イールドリターン」の正しい使い方

2022-03-20 09:25:13

質問

その 降伏 キーワードは、そのうちの1つ キーワード を正しく使えているのか、自信がありません。

次の2つのコードのうち、どちらが好ましいか、またその理由は?

バージョン1: イールドリターンを使用する

public static IEnumerable<Product> GetAllProducts()
{
    using (AdventureWorksEntities db = new AdventureWorksEntities())
    {
        var products = from product in db.Product
                       select product;

        foreach (Product product in products)
        {
            yield return product;
        }
    }
}

バージョン2です。 リストを返す

public static IEnumerable<Product> GetAllProducts()
{
    using (AdventureWorksEntities db = new AdventureWorksEntities())
    {
        var products = from product in db.Product
                       select product;

        return products.ToList<Product>();
    }
}

解決方法は?

リストの次の項目(あるいは次のグループの項目)を計算するとき、イールドリターンを使うことが多いのですが、どうしたらいいですか?

あなたのバージョン2を使用すると、戻る前に完全なリストを持っている必要があります。 しかし、Yield-returnを使用すれば、次の項目さえあればよいことになります。

特に、複雑な計算の計算コストをより大きな時間枠に分散させることができるようになります。 例えば、リストがGUIにフックされている場合、ユーザーが最後のページに行くことがなければ、リストの最後の項目を計算することはありません。

また、IEnumerableが無限集合を表す場合にもyield-returnが望ましいと言えます。 素数のリストや乱数の無限リストを考えてみましょう。 IEnumerable の全機能を一度に返すことはできないので、yield-return を使ってリストを少しずつ返していくのです。

この例では、製品の完全なリストを持っているので、バージョン2を使用します。