C# 使用LINQ to实体将字符串添加到字符串类型的IEnumerable

C# 使用LINQ to实体将字符串添加到字符串类型的IEnumerable,c#,.net,linq,C#,.net,Linq,我有一组对象,它们的属性类型为IEnumerable 我的代码 foreach (var student in students) { string term = SomeMethodhere(); students.Where(x => x.Id == student.Id) .ToList() .ForEach(x => {

我有一组对象,它们的属性类型为
IEnumerable

我的代码

foreach (var student in students)
{
    string term = SomeMethodhere();

    students.Where(x => x.Id == student.Id)
                  .ToList()
                  .ForEach(x => 
                         { 
                            x.FieldsOfStudy.ToList().Add(term); 
                         });
 }
我没有错误,但研究领域保持不变

我错过了什么

我错过了什么

ToList()
创建一个新列表,其中包含在
FieldOfStudy
中找到的所有元素。它不会修改原始枚举

事实上,不能保证任何东西都可以修改原始枚举;很有可能
FieldsOfStudy
实际上是一个数组(因此不能添加任何元素)

底线:您不应该修改作为
IEnumerable提供的内容。如果希望
FieldsOfStudy
是可变的,请将其声明为一个接口,该接口提供修改列表的方法,例如或

设计理念:如果将
字段声明为
IEnumerable
属性,则表示从该属性返回的对象可能是实现
IEnumerable
的任何对象。如果在调用代码时依赖于将该对象强制转换为更具体的对象(可以添加项的对象),则当
FieldsOfStudy
属性的实现发生更改时,调用代码可能会中断。如果可以将
FieldsOfStudy
属性分配给,情况可能会有所不同,因为调用代码可以控制属性中存储的内容

我错过了什么

ToList()
创建一个新列表,其中包含在
FieldOfStudy
中找到的所有元素。它不会修改原始枚举

事实上,不能保证任何东西都可以修改原始枚举;很有可能
FieldsOfStudy
实际上是一个数组(因此不能添加任何元素)

底线:您不应该修改作为
IEnumerable提供的内容。如果希望
FieldsOfStudy
是可变的,请将其声明为一个接口,该接口提供修改列表的方法,例如或


设计理念:如果将
字段声明为
IEnumerable
属性,则表示从该属性返回的对象可能是实现
IEnumerable
的任何对象。如果在调用代码时依赖于将该对象强制转换为更具体的对象(可以添加项的对象),则当
FieldsOfStudy
属性的实现发生更改时,调用代码可能会中断。如果可以将
FieldsOfStudy
属性分配给,情况可能会有所不同,因为调用代码可以控制属性中存储的内容。

x.FieldsOfStudy.ToList()
生成列表的新实例。所以您实际上是在向新集合添加元素

可能的解决方法(如果您可以将new Instance of list设置为property
FieldsOfStudy
):

{
var列表=x.FieldsOfStudy as ILST??新列表(x.FieldsOfStudy);
列表。添加(术语);
x、 FieldsOfStudy=列表;
}

x.FieldsOfStudy.ToList()
生成列表的新实例。所以您实际上是在向新集合添加元素

可能的解决方法(如果您可以将new Instance of list设置为property
FieldsOfStudy
):

{
var列表=x.FieldsOfStudy as ILST??新列表(x.FieldsOfStudy);
列表。添加(术语);
x、 FieldsOfStudy=列表;
}

此处为学生创建循环,然后在同一循环中更新每个学生

可能的解决方案和变化: 提供的研究领域为ICollection或iList

students.ToList().ForEach(s=>s.FieldsOfStudy.Add(SomeMethodhere()));

这里的循环是为学生创建的,然后每个学生在同一个循环中更新

可能的解决方案和变化: 提供的研究领域为ICollection或iList

students.ToList().ForEach(s=>s.FieldsOfStudy.Add(SomeMethodhere()));
x.FieldsOfStudy.ToList()
创建一个新列表,然后丢弃该列表;它应该类似于
x.FieldsOfStudy.Add(术语)
x.FieldsOfStudy.ToList()
创建一个新列表,然后丢弃该列表;它应该类似于
x.FieldsOfStudy.Add(术语)