C#使用Linq过滤列表需要调用ToList方法吗?

时间:2016-11-16 11:39:33

标签: c# linq

我正在尝试使用cq中的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>

我必须执行以下操作来修复,即添加ToList()

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

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

1 个答案:

答案 0 :(得分:1)

Where返回IEnumerable<T>getPersons()方法返回List<Person>。您可以将List<T>替换为IEnumerable<T>,但不能用其他方式替换。

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

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

From MSDN

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