簡體   English   中英

用一行代碼填充Enumerable.ToList

[英]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 thisthis與ID 2名邁克爾再次修改。 這會導致返回this也會發生變化,因為它們引用同一個對象。 您從未使用new創建新對象。 第三次收益率回報也是如此。

要解決這個問題,只需將Person更改為struct(因此它現在是值類型),或者像JanDotNet一樣在他的答案中實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM