我使用Linq选择一些数据,返回的类型是WhereSelectListIterator。我发现无法修改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;
}
}
答案 0 :(得分:4)
LINQ就像在集合上使用yield
运算符一样。如果修改集合,则会使迭代器失效。
要解决此问题,请考虑通过调用IEnumerable<T>
上的ToArray()
或ToList()
来转换为具体的课程,而不是使用IEnumerable<T>
。