我正在尝试使用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?
答案 0 :(得分:1)
Where
返回IEnumerable<T>
,getPersons()
方法返回List<Person>
。您可以将List<T>
替换为IEnumerable<T>
,但不能用其他方式替换。
至于如何修复它,取决于。如果您想在Person集合中使用List<T>
中的方法,那么调用.ToList()
是处理它的正确方法,例如.ForEach()
。
另一方面,如果您不需要List<T>
中的任何方法/属性,则可以将变量声明为IEnumerable<Person> personList = getPersons();
或更改getPersons()
的返回类型。
[SerializableAttribute]
public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>,
IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>