链式 IEnumerable 的方法 Where 和 Select 是否比单独执行它们慢?

Are chained IEnumerable's methods Where and Select slower than doing them separately?

我有一些带有以下调用的继承代码:

第一个:

var pasajesDelServicio = venta.Pasajes.Where(p =>
                        p.ServicioPasaje.ClaveSolicitud == servicio.RequestKey &&
                        p.ServicioPasaje.IndiceServicio == servicio.ServiceIndex);

然后:

DatosPasajeros = pasajesDelServicio.ToList().Select(p => {
                            p.Pasajero.TipoDePasajero = (Dominio.Entidades.Cliente.TipoDePasajero) solicitudVennta.IdTipoPasajero;
                            return new DatosPasajeroCompra
                            {
                                Butaca = p.NumeroAsiento,
                                Pasajero = p.Pasajero,
                                IdVentaDetalle = p.IdVentaDetalle,
                                SubeEn = p.SubeEn,
                                MenuABordo = p.MenuABordo?.Id,
                                Precio = p.PrecioBruto
                            };
                        })

将 Where 和 Select 调用链接起来会不会更有效率?像这样:

DatosPasajeros = venta.Pasajes.Where(p =>
                            p.ServicioPasaje.ClaveSolicitud == servicio.RequestKey &&
                            p.ServicioPasaje.IndiceServicio == servicio.ServiceIndex)
                            .ToList()
                            .Select(p => {
                            p.Pasajero.TipoDePasajero = (Dominio.Entidades.Cliente.TipoDePasajero) solicitudVennta.IdTipoPasajero;
                            return new DatosPasajeroCompra
                            {
                                Butaca = p.NumeroAsiento,
                                Pasajero = p.Pasajero,
                                IdVentaDetalle = p.IdVentaDetalle,
                                SubeEn = p.SubeEn,
                                MenuABordo = p.MenuABordo?.Id,
                                Precio = p.PrecioBruto
                            };
                        })

我试过阅读一些文档,但找不到我的答案。我真的是 C# 新手。

链接本身不会为您节省很多处理,因为在任何一种情况下都将执行完全相同的代码。但是,由于您有一个 pasajesDelServicio 和一个 DatosPasajeros 变量,您可以通过仅使用一个变量来节省一些内存。此外,您可以通过在 Select 之后移动 ToList() 调用来提高效率,只返回数据的一个子集而不是整个实体(并在之后进行过滤)。

HTH

函数链接编译与单独调用函数相同。如果您看一下 IEnuerableExtensions 的接口,您会发现它只是一个采用 this IEnumerable source 的扩展方法。 C# 扩展方法只是语法糖,编译时就好像函数是单独调用的一样。正如其他人所提到的,最好不要在你的情况下调用 .ToList<T>(),因为它是一种浪费。