LINQ - Does the Where expression return new instance or reference to object instance

后端 未结 5 1814
自闭症患者
自闭症患者 2021-01-31 15:01

This is probably a basic question for some, but it affects how I design a piece of my program.

I have a single collection of type A:

IEnumerable         


        
5条回答
  •  旧时难觅i
    2021-01-31 15:35

    Actually it depends on the collection. In some cases, LINQ methods can return cloned objects instead of references to originals. Take a look at this test:

    [Test]
    public void Test_weird_linq()
    {
        var names = new[]{ "Fred", "Roman" };
        var list = names.Select(x => new MyClass() { Name = x });
    
        list.First().Name = "Craig";
        Assert.AreEqual("Craig", list.First().Name);            
    }
    
    public class MyClass
    {
        public string Name { get; set; }
    }
    

    This test will fail, even though many people believe that the same object will be returned by list.First(). It will work if you use another collection "modified with ToList()".

    var list = names.Select(x => new MyClass() { Name = x }).ToList();
    

    I don't know for sure why it works this way, but it's something to have in mind when you write your code :)

    This question can help you understand how LINQ works internally.

提交回复
热议问题