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 ?
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>