为什么无法更改System.Linq.Enumerable.WhereSelectListIterator集合中的对象

时间:2014-12-02 09:06:16

标签: c# linq

我使用Linq选择一些数据,返回的类型是Wh​​ereSelectListIterator。我发现无法修改WhereSelectListIterator中的对象,例如,设置为null或更新该值的任何属性。它是按设计的吗?如何做到这一点?

using System;
using System.Collections.Generic;
using System.Linq;

namespace linqtest
{
    class Program
    {
        static void Main(string[] args)
        {

            var project = new Project()
            {
                Sections = new List<Section>()
                {
                    new Section()
                    {
                        OutDated = new char[2]{'a','d'}

                    },
                    new Section()
                    {
                        OutDated = new char[2]{'a','d'}

                    },
                    new Section()
                    {
                        OutDated = new char[2]{'a','d'}

                    }
                }
            };


            var dates = project.Sections.Select(t=>(new MyString(t.OutDated)));
            Console.Write(dates.ElementAt(0).Description);
            dates.ElementAt(0).Description = "123";
            Console.Write(dates.ElementAt(0).Description);
            Console.Read();

        }
    }


    class MyString
    {
        public MyString(char[] abc)
        {
                Description = new string(abc).Substring(1);
        }
        public string Description { set; get; }
    }
    class Project
    {
        public IEnumerable<Section> Sections;
    }
    internal class Section
    {
        public char[] OutDated;

    }
}

1 个答案:

答案 0 :(得分:4)

LINQ就像在集合上使用yield运算符一样。如果修改集合,则会使迭代器失效。

要解决此问题,请考虑通过调用IEnumerable<T>上的ToArray()ToList()来转换为具体的课程,而不是使用IEnumerable<T>