c#使用Linq过滤列表需要调用ToList方法

本文关键字:调用 ToList 方法 列表 使用 Linq 过滤 | 更新日期: 2023-09-27 18:18:14

我试图在c#中使用Linq过滤列表,如下所示?

 // Returns a List<Person>
 var personList = getPersons();
 if (!string.IsNullOrEmpty(PersonName.Text))
     personList = personList.Where(x => x.Name.Contains("Joe"));

但是我得到错误:

Cannot convert source type 'System.collections.Generic.Ienumerable<Mysite.Models.Person>' to target type 'System.collection.Generic.List<Mysite.Models.Person>

我必须做以下修复即add ToList()

personList = personList.Where(x => x.Name.Contains("Joe")).ToList();

我的问题是,当personList已经是List<Person>类型的列表时,为什么我需要调用ToList ?

c#使用Linq过滤列表需要调用ToList方法

Where返回一个IEnumerable<T>, getPersons()方法返回一个List<Person>。你可以用List<T>代替IEnumerable<T>,但不能反过来。

至于如何修复,那要看情况。如果您想在Person的集合上使用List<T>中的方法,那么调用.ToList()是处理它的正确方法,例如.ForEach()

另一方面,如果您不需要List<T>中的任何方法/属性,那么您可以将变量声明为IEnumerable<Person> personList = getPersons();或更改getPersons()的返回类型。

来自MSDN:

[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, 
IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>