この実装では、手は毎回評価され、別のリストを返しますか?
foreach (Card card in hand.Cards)
{
}
上記の実装を次のように置き換える必要がありますか?
var cards = hand.Cards;
foreach (Card card in cards)
{
}
この実装では、手は毎回評価され、別のリストを返しますか?
foreach (Card card in hand.Cards)
{
}
上記の実装を次のように置き換える必要がありますか?
var cards = hand.Cards;
foreach (Card card in cards)
{
}
いいえ。実際には、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
いいえ、この2つの間に違いはありません。また、EFの場合は、同じクエリです。以下の構文でも:
foreach (Card card in hand.Cards.AsEnumerable())
{
}
これhand.Cards.AsEnumerable()
は最初に評価され、一時変数に保存されます。実際、これは各反復で発生しません。
PS:一般に、foreachループでAsEnumerableを呼び出す必要はありません。これについては、foreach評価について詳しく説明しました。
違いはありません。
しかし、他のコードで使用する場合はhand.Cards
、2 番目のコードで問題ありません。
上に投稿した 2 つのコード スニペットは同一です。IEnumerable インターフェイスを実装するコレクションを列挙する場合、GetEnumerator
メソッドを使用してアイテムをループし、オブジェクトの重複コピーを作成しません。
上記の唯一の違いは、元のコレクションへの同じ参照を保持する 2 番目の変数を作成していることです。この場合、これは何の役にも立ちません。