使用linq和lambda表达式时遇到了一些问题。我有一个Type Trip的对象。
`
List<Trip> trip = newTrips.Select(x=>x).ToList();
IEnumerable<Trip> data = trip.GroupBy(y=> new {
y.StartingNode,
y.EndingNode,
y.PathNumber}).Cast<Trip>();
List <Trip> listAgain = data.ToList(); // This is where i get the error
无法将system.collection.generics.list隐式转换为DataObjects.Trip
` 我需要将从linq获得的结果转换为列表对象。或者还有其他更好的方法来实现这一目标。
答案 0 :(得分:0)
您无法将GroupBy
的结果转换为Trip
- 它不会返回Trip
。见http://msdn.microsoft.com/en-us/library/bb534501.aspx
请注意,错误发生在第三个作业的原因是因为GroupBy
和Cast
被推迟了。
答案 1 :(得分:0)
trip.GroupBy(...)
不会返回IEnumerable<Trip>
。它返回IEnumerable<IGrouping<'a, Trip>>
,其中'a
是为new {...}
个对象创建的匿名类型。
这些IGrouping<'a, Trip>
个对象是集合,无法直接转换为Trip
。
如果每个组只需要一个对象,请执行:
IEnumerable<Trip> data = trip
.GroupBy(y => new {
y.StartingNode,
y.EndingNode,
y.PathNumber
})
.Select(g => g.First());
List<Trip> listAgain = data.ToList();
或者,如果您想要所有旅行对象,但是通过它们的开始/结束节点及其路径编号很好地分组,请执行:
IEnumerable<Trip> data = trip
.GroupBy(y => new {
y.StartingNode,
y.EndingNode,
y.PathNumber
})
.SelectMany(g => g);
List<Trip> listAgain = data.ToList();
IGrouping
个对象由原始类型模板化,并为 .First()和返回Trip
个对象.SelectMany()