2

この実装では、手は毎回評価され、別のリストを返しますか?

foreach (Card card in hand.Cards)
{ 

}

上記の実装を次のように置き換える必要がありますか?

var cards = hand.Cards;
foreach (Card card in cards)
{ 

} 
4

4 に答える 4

4

いいえ。実際には、2つのスニペットは同じコードになります。以下のスニペット:

foreach (Card card in hand.Cards)
{ 

}

hand.Cards一度だけ呼び出されます。

編集:

小さなスニペットを作成しました。違いがまったくないことを示すことを願っています。

void Main()
{
    Hand hand = new Hand();
    foreach( var card in hand.Cards() )
    {
        Console.WriteLine("{0}", card);
    }

    var allCards = hand.Cards();
    foreach( var anotherCard in allCards )
    {
        Console.WriteLine("{0}", anotherCard);
    }
}

public class Card
{
private string _cardName;
public Card( string cardName )
    {
        this._cardName = cardName;
    }

    public override string ToString()
    {
        return this._cardName;
    }
}

public class Hand
{
    public IEnumerable<Card> Cards()
    {
        yield return new Card("Ace");
        yield return new Card("King");
    }
}

otuput(両方の方法)は次のとおりです。

Ace
King
Ace
King
于 2012-09-01T14:18:32.477 に答える
0

いいえ、この2つの間に違いはありません。また、EFの場合は、同じクエリです。以下の構文でも:

foreach (Card card in hand.Cards.AsEnumerable())
{ 

}

これhand.Cards.AsEnumerable()は最初に評価され、一時変数に保存されます。実際、これは各反復で発生しません。

PS:一般に、foreachループでAsEnumerableを呼び出す必要はありません。これについては、foreach評価について詳しく説明しました。

于 2012-09-01T14:18:18.053 に答える
0

違いはありません。

しかし、他のコードで使用する場合はhand.Cards、2 番目のコードで問題ありません。

于 2012-09-01T14:19:46.853 に答える
0

上に投稿した 2 つのコード スニペットは同一です。IEnumerable インターフェイスを実装するコレクションを列挙する場合、GetEnumeratorメソッドを使用してアイテムをループし、オブジェクトの重複コピーを作成しません。

上記の唯一の違いは、元のコレクションへの同じ参照を保持する 2 番目の変数を作成していることです。この場合、これは何の役にも立ちません。

于 2012-09-01T14:20:49.863 に答える