[英]Populate Enumerable.ToList with one line of code
請看下面的人員類:
public class Person
{
int _id { get; set; }
string _name { get; set; }
public Person (int id, string name)
{
_id = id;
_name = name;
}
public Person()
{
}
public IEnumerable<Person> GetPeople()
{
_id = 1;
_name = "James";
yield return this;
_id = 2;
_name = "Michael";
yield return this;
_id = 3;
_name = "Sarah";
yield return this;
}
}
以及下面的客戶代碼:
Person p1 = new Person();
IEnumerable<Person> personEnumerable = p1.GetPeople();
List<Person> personList = personEnumerable.ToList();
為什么PersonList在運行之后包含Sarah的三個條目? 在客戶端中填充personList的最佳方法是什么?
因為GetPeople
不會創建新實例但會修改當前實例並將其返回3次。
以下代碼生成預期結果:
public static IEnumerable<Person> GetPeople()
{
yield return new Person(1, "James");
yield return new Person(2, "Michael");
yield return new Person(3, "Sarah");
}
你可能應該看到這種行為,對吧?
var p1 = new Person(1, "Tom");
var p2 = p1;
p2._id = 2;
// now p1._id is 2 as well!
這正是這里發生的事情。 第一后return this
, this
與ID 2名邁克爾再次修改。 這會導致返回this
也會發生變化,因為它們引用同一個對象。 您從未使用new
創建新對象。 第三次收益率回報也是如此。
要解決這個問題,只需將Person
更改為struct(因此它現在是值類型),或者像JanDotNet一樣在他的答案中實現。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.