のEr、かなり確実ではないかとフレーズこれをしかし、列挙内の最初の項目のコピーを返すように見える..はなぜ考えるEnumerable.First()
を呼び出すんIEnumerableを3つのインスタンスを含む、歩留まりのリターンを使用して作成.First()を呼び出すのが最初のインスタンスの 'コピー'を返すように見えるのはなぜですか?
次のコードを参照してください。
public class Thing
{
public bool Updated { get; set; }
public string Name { get; private set; }
public Thing(string name)
{
Name = name;
}
public override string ToString()
{
return string.Format("{0} updated {1} {2}", Name, Updated, GetHashCode());
}
}
class Program
{
static void Main(string[] args)
{
Console.WriteLine("IEnumerable<Thing>");
var enumerableThings = GetThings();
var firstThing = enumerableThings.First();
firstThing.Updated = true;
Console.WriteLine("Updated {0}", firstThing);
foreach (var t in enumerableThings)
Console.WriteLine(t);
Console.WriteLine("IList<Thing>");
var thingList = GetThings().ToList();
var thing1 = thingList.First();
thing1.Updated = true;
Console.WriteLine("Updated {0}", thing1);
foreach (var t in thingList)
Console.WriteLine(t);
Console.ReadLine();
}
private static IEnumerable<Thing> GetThings()
{
for (int i = 1; i <= 3; i++)
{
yield return new Thing(string.Format("thing {0}", i));
}
}
}
}
これを実行すると、次の出力が生成されます。
IEnumerable<Thing>
Updated thing 1 updated True 37121646
thing 1 updated False 45592480
thing 2 updated False 57352375
thing 3 updated False 2637164
IList<Thing>
Updated thing 1 updated True 41014879
thing 1 updated True 41014879
thing 2 updated False 3888474
thing 3 updated False 25209742
が、私はIListのとIEnmerableが同じで、このような出力を振る舞うことを期待する...
IEnumerable<Thing>
Updated thing 1 updated True 45592480
thing 1 updated False 45592480
thing 2 updated False 57352375
thing 3 updated False 2637164
IList<Thing>
Updated thing 1 updated True 41014879
thing 1 updated True 41014879
thing 2 updated False 3888474
thing 3 updated False 25209742
私は何をしないのです!
Dan Bryantの回答は、正確な用語で技術的な部分をよりよくカバーしています。:) –
もちろん、まあ、ありがとう – sackoverflow