使用Linq对列表中除最后一个元素外的所有元素执行操作

本文关键字:元素 操作 执行 最后一个 Linq 列表 使用 | 更新日期: 2023-09-27 18:24:21

虽然我对此没有硬性要求,但我希望操作列表中除最后一个元素外的所有元素。例如,假设一个类Cars

public class Car {
  public string Name { get; set; }
  public List<Tire> Tires { get; set; }
}
var cars = _db.GetAllCars().Select(x => new Car {
  Name = x.Name + ", ",
  Tires = x.Tires
});

这是有效的,除了列表中的最后一个元素会有逗号,我不想要。。。但我还是想要清单上的最后一项。我不能这么简单的字符串。在我将其传递给一个视图时加入,该视图在Name元素周围有很多模板代码。我想做的事情可能吗?

使用Linq对列表中除最后一个元素外的所有元素执行操作

试试这个:

var cars = _db.GetAllCars().Reverse().Select((x, i) => new Car {
    Name = x.Name + (i == 0 ? "" : ", "),
    Tires = x.Tires
}).Reverse();

改进版的Lolo(在那里打分)

var cars = _db.GetAllCars().Select((x, i) => new Car {
    Name = (i == 0 ? "" : ", ") + x.Name  ,
    Tires = x.Tires
});

关于:

var allCars = _db.GetAllCars();
var cars = allCars.Select((x, i) => new Car { //where i is the index
   Name = x.Name + (i != allCars.Count - 1 ? ", " : string.Empty), //or "." if you need a comma
   Tires = x.Tires
});

编辑:

正如@newStackExchangeInstance所说,如果_db.GetAllCars()返回ICollection,则此操作有效,否则您需要将其放入列表中:

var allCars = _db.GetAllCars().ToList();

或者只使用Count()扩展方法。

如果您真的想在从数据源检索后立即操作它:

var allCars = _db.GetAllCars().Select(x => new Car {
    Name = x.Name,
    Tires = x.Tires
}).ToList();
var cars = allCars.Take(allCars.Count() - 1).Select(x => new Car
{
    Name = x.Name + ", ",
    Tires = x.Tires
}).Concat(new[] { new Car {
    Name = allCars.Last().Name,
    Tires = allCars.Last().Tires
}});