将Linq查询转换为自定义类型

时间:2010-11-15 01:35:36

标签: linq-to-objects

使用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获得的结果转换为列表对象。或者还有其他更好的方法来实现这一目标。

2 个答案:

答案 0 :(得分:0)

您无法将GroupBy的结果转换为Trip - 它不会返回Trip。见http://msdn.microsoft.com/en-us/library/bb534501.aspx

请注意,错误发生在第三个作业的原因是因为GroupByCast被推迟了。

答案 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()