C# C使用Linq筛选列表需要调用ToList方法吗?

C# C使用Linq筛选列表需要调用ToList方法吗?,c#,linq,C#,Linq,我正在尝试使用c中的Linq筛选列表,如下所示 // Returns a List<Person> var personList = getPersons(); if (!string.IsNullOrEmpty(PersonName.Text)) personList = personList.Where(x => x.Name.Contains("Joe")); 我的问题是,当personList已经是list类型的列表时,为什么需要调用ToList?其

我正在尝试使用c中的Linq筛选列表,如下所示

 // Returns a List<Person>
 var personList = getPersons();

 if (!string.IsNullOrEmpty(PersonName.Text))
     personList = personList.Where(x => x.Name.Contains("Joe"));
我的问题是,当personList已经是list类型的列表时,为什么需要调用ToList?

其中返回IEnumerable,getPersons方法返回list。可以用列表代替IEnumerable,但不能反过来

至于如何修复,这要看情况而定。如果要在Person集合上使用List中的方法,则调用.ToList是正确的处理方法,例如.ForEach

另一方面,如果不需要列表中的任何方法/属性,则可以将变量声明为IEnumerable personList=getPersons;或更改getPersons的返回类型

:


因为Where不返回列表,它基本上只是返回查询,而不是集合。如果您将personList声明为IEnumerable,它也会编译。@Tim getPersons方法返回一个列表,因此无法将其更改为IEnumerable。如果我没有使用lambda表达式,也就是说,在personList中执行类似于p的操作,其中p.name='Joe'select pList实现了IEnumerable,那么您只需要用IEnumerableen替换var。如果您不需要列表中的方法,那么在应用所有过滤器后应该调用ToList。所以不是每次你打电话到哪里,而是在那里。否则,在触摸序列时总是执行查询。
Cannot convert source type 'System.collections.Generic.Ienumerable<Mysite.Models.Person>' to target type 'System.collection.Generic.List<Mysite.Models.Person>
personList = personList.Where(x => x.Name.Contains("Joe")).ToList();
[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, 
IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>